Forum und email

表達式

表達式是 PHP 程式的最根本的組成部份。 用 PHP 編程,幾乎所有你寫得下來的指令句都是表達式。 用最簡單且最精確的句子來描述表達式就是: "任何有值的東西"。

最基本的表達式是常數和變數。當你輸入 "$a = 5", 你把 '5' 指派給 $a。 '5', 當然代表數值 5, 但換個說法是 '5' 是一個表達式, 它的值是 5。(在本例中, '5' 是一個整數形態的常數).

這個指派操作完成後, $a 的值也應該是 5, 假如你再寫 $b = $a,它給出的結果應該和寫 $b = 5 是一樣的。 換個說法, $a 也一個表達式, 它表達的值同樣是 5。 如果沒做錯什麼的話, 得出的結果就是這個。

較複雜的表達式可以用函數來作示範。 如以下的例子,

function foo () {
    return 5;
}
     

如你對函數應用有一定認識 (如否請看有關函數的章節), 你會同意$c = foo() 和 $c = 5 這兩句是一樣的。 事實上正是這樣。 函數也是一種表達式, 它們所表達的值就是函數的運算結果(傳回值)。 因為 foo() 傳回 5, 所以表達式 'foo()' 的值就是 5。 當然一般來說函數不會光傳回一個常數而是要作些運算的。

當然, 值不一定是整數。 PHP 可以讓你應用三種不同類形的純量值, 分別是整數、浮點數、文句。(純量值就是不能再分成更小的分量的值,非純量值的例子有矢量,陣列等)。另外 PHP 也支援陣列和物件兩類非純量值。 從函數傳回的值的形態和指派給變數的值的形態可以是上述的任何一種值。

到目前為止, 用 PHP/FI 2 的人應不會覺得有什麼不一樣。 然而, PHP 把表達式的概念進一步發揮, 變成和很多別的程式語言一樣。 PHP 是以表達式為基礎的編程語言, 這樣說是因為幾乎所有 PHP 的句子都是由表達式組成。 分析上面用過的例子 '$a = 5',很明顯的在操作中有兩項值, 一項是整數 '5', 另一項是 $a 的值, 它會被 '5' 所取代。 不過其實還有另一個值存在,它就是表達式本身所表達的值。 在本例中表達式的值就是指代值, 也就是 '5'‧ 應用的時候我們可以把 '$a=5' 看成是個傳回 '5' 這個值的表達式。 由此, 如果你寫 '$b = ($a = 5)' 就等同於寫 '$a = 5; $b = 5;' (分號代表語句的結束)。 再進一步說, 因為表達式是從右向左來做運算的, 所以就算簡單的寫成 '$b = $a = 5', 答案也是一樣的。

以表達式為基本的操作還有另外一種很好的示例。 就是前置或後置的增值和損值操作。 使用 PHP/FI 2 和許多其他語言的程式員大概已看慣了 變數++ 和 變數-- 的表達句式。 這些便是增值和損值運算符。 在 PHP/FI 2 的時候, '$a++' 並不代表任何值 (並不是一個表達式), 因此基本上你不能用它來做別的事。 到了 PHP, 這些句式都變成了表達式 (就像 C 一樣)。 另外和 C 相同的是, 有兩種增值算符: 前置的和後置的。 兩種都會把變數增加 1, 分別在於其表達式所表達的值。 前置式是寫成 '++$variable', 傳回的是增值後的值; (PHP 在讀取表達式的值之前先把變數值加 1, 因此叫前置) 後置表達式寫成 '$variable++' 傳回變數還沒增加 1 前的值 (PHP 讀取的表達式的值之後才把變數增值)。

比較式是一種極之常見的表達式。 這類表達式的運算結果是 1 或 0, 分別代表邏輯值 真 和 假。 PHP 明白 > (大於); >= (大於或等於); == (等於); != (不等於); < (小於); <= (小於或等於)。 這類表達式通常用在條件句之中, 如if 語句。

最後一個示範我們會面對一類同時做指派和運算的表達式。 你已知道如果想把 $a 增加 1, 可以直接用 '$a++' 或 '++$a'。 但是如果你其實是想把 $a 增加多一些, 比如說 '3' 那該怎樣做 ? 當然可以連寫 3 行'$a++', 不過這很不好看。 較平民的做法是用 '$a=$a+3;': '$a + 3' 的表達的是 $a 再加上 3, 這結果會放回變數 $a 之中, 整個運算完成後 $a 的內容會增加了 3。 用 PHP 和許多其他語言同樣可以把此類操作寫成另一個較簡單的句式,將來這種句法可能會更流行也更易理解。 把 $a 的值增加 3 可寫成 '$a += 3'. 它代正正代表了把 $a 的值拿出來, 增加 3, 再存回 $a 當中。除了更短和更明白之外, 這句式執行起來也更快。 這句表達式傳回的值和討論 regular expr 時一樣, 是表達式運算的結果 '$a+3'。 任何一個需要兩個運算元的運算符都可用此類句式造句, 例如 '$a -= 5' (把 $a 減 5), '$b *= 7' (把 $b 乘以 7) 等。

另外有一種看起來比較怪但是在其他的程式語言中也會用到的表達式: (ternary conditional operator 三元運算式)

$first ? $second : $third
當第一個表達分式成立時, 第二個表達分式會被執行而運算結果會成為整個表達式的值。 當第一個表達分式不成立時, 第三個分式的結果會成為整個表達式的值。

以下的示範會幫你更好地掌握前置和後置增值運算符和表達式的運用:

function double($i) {
    return $i*2;
}
$b = $a = 5;        /* assign the value five into the variable $a and $b */
$c = $a++;          /* post-increment, assign original value of $a 
                       (5) to $c */
$e = $d = ++$b;     /* pre-increment, assign the incremented value of 
                       $b (6) to $d and $e */

/* at this point, both $d and $e are equal to 6 */

$f = double($d++);  /* assign twice the value of $d 
before
 
                       the increment, 2*6 = 12 to $f */
$g = double(++$e);  /* assign twice the value of $e 
after
                       the increment, 2*7 = 14 to $g */
$h = $g += 10;      /* first, $g is incremented by 10 and ends with the 
                       value of 24. the value of the assignment (24) is 
                       then assigned into $h, and $h ends with the value 
                       of 24 as well. */

在本章開始時我們說會講到語句 statment 的類型。 表達式可以是語句, 但並非全部的表達代都是語句。 在上例中, 語句的形式是 'expr' ';' , 就是一項表達式加上分號。 比如 '$b=$a=5;', $a=5 是一個合法的表達式但不是一句語句。 但 '$b=$a=5;' 倒是一句合法的語句。

最後值的一提的是表達式的邏輯值。許多情況下, 尤其是條件句和迴圈句裏, 表達式的值並不是重點反而該表達式是否成立 ( TRUE 還是 FALSE)。 (PHP 並沒有特別指定邏輯變數類。) 表達式的真假值的計算方法和 perl 差不多。 任何不等於 0 的數字都代表真, 0 則代表假。 當心負數因為也不等 0 , 所以也代表真! 空的文句或文句 "0" 是假, 所有其他文句都是真。 至於像陣列和物件這樣的非純量值, 如果結果是空的陣列則代表真, 反之則是假。

PHP 提供了完整而且功能強大的表達式。 本手冊沒可能把所有可用的表達式的句法統統整理成文件, 但上面的示範應可讓你知道造句的方法。 在本手冊之中, 我們會用 expr 來代表合法的表達式。