一、表達式
在 PHP 中,表達式是最重要的構建部分。幾乎所有的代碼都可以看作是表達式,簡單而精確的表達式定義是“任何有值的東西”。
常量和變量是最基本的表達式形式。例如,當鍵入 $a = 5 時,值 5 將被分配給變量 $a,此時 5 就是一個值為 5 的表達式(在這里,5 是一個整型常量)。賦值之后,期望 $a 的值為 5,因此如果寫下 $b = $a,則期望它的行為與 $b = 5 相同,即 $a 也是值為 5 的表達式。如果一切正確,那么就會發(fā)生這件事情。
稍微復雜的表達式例子就是函數(shù),例如:
<?php function foo () { return 5; } ?>
如果已經(jīng)熟悉了函數(shù)的概念,那么本質(zhì)上鍵入 $c = foo() 就如同寫下 $c = 5。函數(shù)是具有返回值的表達式。由于 foo() 返回 5,表達式“foo()”的值也是 5。通常函數(shù)不僅會返回靜態(tài)值,還會計算一些東西。
當然,PHP 中的值并非都是整型的。PHP 支持四種標量值(標量值不能拆分為更小的單元,例如,和數(shù)組不同)類型:
- int 值
- 浮點數(shù)值(float)
- string 值
- bool 值
PHP 也支持兩種復合類型:
- 數(shù)組
- 對象
這些值類型可以賦值給變量或者從函數(shù)返回。
PHP 是一種面向表達式的語言,從這一方面來講幾乎一切都是表達式。考慮剛才已經(jīng)研究過的例子 $a = 5。很顯然這里涉及到兩個值,整數(shù)常量 5 的值以及變量 $a 的值,也被更新為 5。但事實是這里還涉及到一個額外的值,即附值語句本身的值。賦值語句本身求值為被賦的值,即 5。實際上這意味著 $a = 5,無論做什么,都是一個值為 5 的表達式。因此編寫 $b = ($a = 5) 跟編寫 $a = 5; $b = 5;(分號標志著語句的結束)是一樣的。因為賦值操作的順序是由右到左的,也可以寫成 $b = $a = 5。
另外一個很好的面向表達式的例子就是前、后遞增和遞減。PHP 和多數(shù)其它語言的用戶應該比較熟悉 variable++ 和 variable– 符號。即遞增和遞減運算符。在 PHP 和 C 語言中,有兩種類型的遞增——前遞增和后遞增。本質(zhì)上來講,前遞增和后遞增均增加了變量的值,并且對于變量的影響是相同的。不同的是遞增表達式的值。前遞增,寫做 ++$variable,求增加后的值(PHP 在讀取變量的值之前,增加變量的值,因而稱之為“前遞增”)。后遞增,寫做 $variable++,求 $variable 未遞增之前的原始值(PHP 在讀取變量的值之后,增加變量的值,因而叫做“后遞增”)。
二、比較表達式
一個常用到的表達式類型是比較表達式。這些表達式求值 false 或 true。PHP 支持 >(大于)、>=(大于等于)、==(等于)、!=(不等于)、<(小于)、<= (小于等于)。PHP 還支持全等運算符 ===(值和類型均相同)和非全等運算符 !==(值或者類型不同)。這些表達式都是在條件判斷語句,比如 if。
三、運算賦值表達式
已經(jīng)知道如果想要為變量 $a 加 1,可以簡單的寫 $a++ 或者 ++$a。但是如果想為變量增加大于 1 的值,比如 3,接下來可以寫 $a++ 多次,但這樣明顯不是一種高效舒適的方法,一個更加便捷的做法是 $a = $a + 3。$a + 3 計算 $a 加上 3 的值,并將其賦予給 $a,于是 $a 的值增加了 3。
在 PHP 及其它幾種類似 C 的語言中,可以以一種更加簡短的形式完成上述功能,隨著時間的推移,會變得更加清晰、更容易理解。為 $a 的當前值加 3,可以這樣寫 $a += 3。這里的意思是“取變量 $a 的值,加 3,得到的結果再次分配給變量 $a”。除了更短和清楚外,也可以加快執(zhí)行速度。$a += 3 的值,如同一個正常賦值操作的值,是賦值后的值。注意它不是 3,而是 $a 的值加上3 之后的值(此值將被賦給 $a)。任何二元運算符都可以用運算賦值模式,例如 $a -= 5(從變量 $a 的值中減去 5),$b *= 7(變量 $b 乘以 7),等等。
四、三元條件運算符
還有一個表達式,如果沒有在別的語言中看到過的話,可能看上去很奇怪,即三元條件運算符:
<?php $first ? $second : $third ?>
如果第一個子表達式的值是 true(非零),那么計算第二個子表達式的值,其值即為整個表達式的值。否則,將第三個子表達式的值作為整個表達式的值。
下面的例子有助于更好的理解前、后遞增和表達式:
<?php function double($i) { return $i*2; } $b = $a = 5; /* 賦值 5 到變量 $a 和 $b */ $c = $a++; /* 后自增,將 $a(5)的原始值賦給 $c */ $e = $d = ++$b; /* 前自增,將 $b(6)的遞增值賦給 $d 和 $e */ /* 此時, $d 和 $e 都等于 6 */ $f = double($d++); /* 自增前將兩倍值賦值給 $d ,即 2*6 = 12 賦值給 $f */ $g = double(++$e); /* 自增后將兩倍值賦值給 $e ,即 2*7 = 14 賦值給 $g */ $h = $g += 10; /* 首先,$g 自增 10 后等于 24。然后將值(24)賦值給了 $h, $h 的值也等于 24。 */ ?>
表達式可以被當作語句使用,形式為 ‘expr ;’,即一個表達式后跟一個分號。例如,在 $b = $a = 5; 中,$a = 5 是一個有效的表達式,但它本身不是一條語句。而整個語句 $b = $a = 5; 才是一條有效的語句。但有些情況下并不關心表達式的具體值,而只關心它是 true 還是 false。在條件執(zhí)行和循環(huán)等情況下,通常關注表達式的真假值。PHP 中有兩個布爾值常量,即 true 和 false(大小寫不敏感),表達式會自動轉(zhuǎn)換為布爾值。
總而言之,PHP 提供了強大且完整的表達式實現(xiàn)。上述例子詳細講述了表達式的概念以及如何構建有用的表達式。