運算式是 PHP 最重要的基石。在 PHP 中,幾乎所寫的任何東西都是一個運算式。簡單但卻最精確的定義一個運算式的方式就是“任何有值的東西”。
最基本的運算式形式是常量和變數。當鍵入“ $a = 5”,即將值“5”分配給變數 $a 。“5”,很明顯,其值為 5,換句話說“5”是一個值為 5 的運算式(在這裡,“5”是一個整型常量)。
賦值之後,所期待情況是 $a 的值為 5,因而如果寫下 $b = $a ,期望的是它猶如 $b = 5 一樣。換句話說, $a 是一個值也為 5 的運算式。如果一切運行正確,那這正是將要發生的正確結果。
稍微複雜的運算式例子就是函數。例如,考慮下面的函數:
<?phpfunction foo (){ return 5 ;}?>
假定已經熟悉了函數的概念(果不是的話,請看一下函數的相關章節),那麼鍵入 $c = foo() 從本質上來說就如寫下 $c = 5,這沒錯。函數也是運算式,運算式的值即為它們的傳回值。既然 foo() 返回 5,運算式“foo()”的值也是 5。通常函數不會僅僅返回一個靜態值,而可能會計算一些東西。
當然,PHP 中的值常常並非是整型的。PHP 支援四種標量值(標量值不能拆分為更小的單元,例如和數組不同)類型:整型值( integer ),浮點數值( float ),字串值( string )和布爾值( boolean )。PHP 也支援兩種複合類型:數組和對象。這兩種類型具可以賦值給變數或者從函數返回。
PHP 和其它語言一樣在運算式的道路上發展,但推進得更深遠。PHP 是一種面向運算式的語言,從這一方面來講幾乎一切都是運算式。考慮剛才已經研究過的例子,“ $a = 5”。很顯然這裡涉及到兩個值,整型常量 5 的值以及而且變數 $a 的值,它也被更新為 5。但是事實是這裡還涉及到一個額外的值,即附值語句本身的值。指派陳述式本身求值為被賦的值,即 5。實際上這意味著“ $a = 5”,不必管它是做什麼的,是一個值為 5 的運算式。因而,這樣寫“ $b = ( $a = 5)”和這樣寫“ $a =5; $b =5”(分號標誌著語句的結束)是一樣的。因為賦值操作的順序是由右到左的,也可以這麼寫“ $b = $a =5”。
另外一個很好的面向運算式的例子就是前、後遞增和遞減。PHP 和多數其它語言的使用者應該比較熟悉變數 ++ 和變數 -- 符號。即遞增和遞減運算子。在 PHP/FI 2 中,語句“$a++”沒有值(不是運算式),這樣的話你便不能為其賦值或者以任何其它方式來使用它。PHP 通過將其變為了運算式,類似 C 語言,增強了遞增/遞減的能力。在 PHP 和 C 語言 中,有兩種類型的遞增前遞增和後遞增,本質上來講,前遞增和後遞增均增加了變數的值,並且對於變數的影響是相同的。不同的是遞增運算式的值。前遞增,寫做“++$variable”,求增加後的值(PHP 在讀取變數的值之前,增加變數的值,因而稱之為“前遞增”)。後遞增,寫做“$variable++”,求變數未遞增之前的原始值(PHP 在讀取變數的值之後,增加變數的值,因而叫做“後遞增”)。
一個常用到運算式類型是比較運算式。這些運算式求值 FALSE 或 TRUE 。PHP 支援 >(大於),>=(大於等於),==(等於),!=(不等於),<(小於),<= (小於等於)。PHP 還支援全等運算子 ===(值和類型均相同)和非全等運算子 !==(值或者類型不同)。這些運算式都是在條件判斷語句,比如,if 語句中最常用的。
這裡,將要研究的最後一個例子是組合的運算賦值運算式。已經知道如果想要為變數 $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”。除了更簡略和清楚外,也可以更快的運行。“$a += 3”的值,如同一個正常賦值操作的值,是賦值後的值。注意它不是 3,而是 $a 的值加上3 之後的值(此值將被賦給 $a)。任何二元運算子都可以用運算賦值模式,例如“$a -= 5”(從變數 $a 的值中減去 5),“$b *= 7”(變數 $b 乘以 7),等等。
還有一個運算式,如果沒有在別的語言中看到過的話,可能看上去很奇怪,即三元條件運算子:
$first ? $second : $third
如果第一個子運算式的值是 TRUE (非零),那麼計算第二個子運算式的值,其值即為整個運算式的值。否則,將是第三個子運算式的值。
下面的例子一般來說應該有助於理解前、後遞增和運算式:
<?phpfunction double ( $i ){ return $i * 2 ;}$b = $a = 5 ; $c = $a ++; $e = $d = ++ $b ; $f = double ( $d ++); $g = double (++ $e ); $h = $g += 10 ; ?>
一些運算式可以被當成語句。這時,一條語句的形式是 'expr' ';',即一個運算式加一個分號結尾。在“$b=$a=5;”中,$a=5 是一個有效運算式,但它本身不是一條語句。“$b=$a=5;”是一條有效語句。
最後一件值得提起的事情就是運算式的真值。在許多事件中,大體上主要是在條件執行和迴圈中,不要專註於運算式中明確的值,反而要注意運算式的值是否是 TRUE 或者 FALSE 。常量 TRUE 和 FALSE (大小寫無關)是兩種可能的 Boolean 值。如果有必要,一個運算式將自動轉換為 Boolean。參見類型強制轉換一節。
PHP 提供了一套完整強大的運算式,而為它提供完整的檔案資料已經超出了本手冊的範圍。上面的例子應該為你提供了一個好的關於什麼是運算式和怎樣構建一個有用的運算式的概念。在本手冊的其餘部分,我們將始終使用expr 來表示一個有效 PHP 運算式。