章 15. 運算符

運算符是可以通過給出的一或多個值(用寫程式行話來說,表達式)來產生另一個值(因而整個結構成為一個表達式)的東西。所以可以認為函數或任何會返回一個值(例如 print)的結構是運算符,而那些沒有返回值的(例如 echo)是別的東西。

有三種類型的運算符。第一種是一元運算符,只運算一個值,例如 !(取反運算符)或 ++(加一運算符)。第二種是有限二元運算符,PHP 支援的大多數運算符都是這種。清單見下節運算符優先級

第三種是三元運算符:?:。它應該被用來根據一個表達式在另兩個表達式中選取一個,而不是用來在兩個語句或是程式路線中選取。把整個三元表達式放在擴號裡是個很好的主意。

運算符優先級

運算符優先級指定了兩個表達式綁定得有多「緊密」。例如,表達式 1 + 5 * 3 的結果是 16 而不是 18 是因為乘號(「*」)的優先級比加號(「+」)高。必要時可以用括號來強制改變優先級。例如:(1 + 5) * 3 的值為 18。若果運算符優先級相同,則使用從左到右的左聯順序。

下表從高到低列出了運算符的優先級。同一行中的運算符具有相同優先級,此時它們的結合方向決定求值順序。

表格 15-1. 運算符優先級

結合方向運算符附加訊息
非結合newnew
[array()
非結合++ -- 遞增/遞減運算符
非結合! ~ - (int) (float) (string) (array) (object) @ 類型
* / % 算數運算符
+ - . 算數運算符字串運算符
<< >> 位運算符
非結合< <= > >= 比較運算符
非結合== != === !== 比較運算符
& 位運算符引用
^ 位運算符
| 位運算符
&& 邏輯運算符
|| 邏輯運算符
? : 三元運算符
= += -= *= /= .= %= &= |= ^= <<= >>= 賦值運算符
and 邏輯運算符
xor 邏輯運算符
or 邏輯運算符
,多處用到

左聯表示表達式從左向右求值,右聯相反。

例子 15-1. 結合方向

<?php
$a 
5// (3 * 3) % 5 = 4
$a true true 2// (true ? 0 : true) ? 1 : 2 = 2

$a 1;
$b 2;
$a $b += 3// $a = ($b += 3) -> $a = 5, $b = 5
?>
使用括號可以增強代碼的可讀性。

注: 儘管 != 的優先級高,PHP 仍舊容許類似如下的表達式:if (!$a = foo()),在此例中 foo() 的輸出被賦給了 $a