運算符是可以通過給出的一或多個表達式來產生另一個表達式的東西。與javascript類似,php也擁有類似的運算符語法,本文將詳細介紹php運算符
[注意]關於javascript運算符語法移步至此
運算符可按照其能接受幾個值來分組。一元運算符只能接受一個值,例如 !(邏輯取反運算符)或 ++(遞增運算符)。 二元運算符可接受兩個值,例如熟悉的算術運算符 +(加)和 -(減),大多數 PHP 運算符都是這種。最後是唯一的三元運算符 ? :,可接受三個值;通常就簡單稱之為“三元運算符”
運算符優先級指定了兩個表達式綁定得有多“緊密”。例如,表達式 1 + 5 * 3 的結果是 16 而不是 18 是因為乘號(“*”)的優先級比加號(“+”)高。必要時可以用括號來強制改變優先級。例如:(1 + 5) * 3 的值為 18
如果運算符優先級相同,那運算符的結合方向決定了該如何運算。例如,"-"是左聯的,那麼 1 - 2 - 3 就等同於 (1 - 2) - 3 並且結果是 -4. 另外一方面,"="是右聯的,所以 $a = $b = $c 等同於 $a = ($b = $c)
[注意]沒有結合的相同優先級的運算符不能連在一起使用,例如 1 < 2 > 1 在PHP是不合法的。但另外一方面表達式 1 <= 1 == 1 是合法的, 因為 == 的優先級低於 <=
優先級
結合方向 運算符 附加信息 無 clone new clone 和 new 左 [ array() 右 ++ -- ~ 類型和遞增/遞減 無 instanceof 類型 右 ! 邏輯運算符 左 * / % 算術運算符 左 + - . 算術運算符和字符串運算符 左 << >> 位運算符 無 < <= > >= 比較運算符 無 == != === !== <> <=> 比較運算符 左 & 位運算符和引用 左 ^ 位運算符 左 | 位運算符 左 && 邏輯運算符 左 || 邏輯運算符 左 ?? 比較運算符 左 ? : ternary 右 = += -= *= **= /= .= %= &= |= ^= <<= >>= 賦值運算符 左 and 邏輯運算符 左 xor 邏輯運算符 左 or 邏輯運算符
-$a 取反 $a 的負值。 $a + $b 加法 $a 和 $b 的和。 $a - $b 減法 $a 和 $b 的差。 $a * $b 乘法 $a 和 $b 的積。 $a / $b 除法 $a 除以 $b 的商。 $a % $b 取模 $a 除以 $b 的余數
除法運算符總是返回浮點數。只有在下列情況例外:兩個操作數都是整數(或字符串轉換成的整數)並且正好能整除,這時它返回一個整數
取模運算符的操作數在運算之前都會轉換成整數(除去小數部分)
取模運算符 % 的結果和被除數的符號(正負號)相同。即 $a % $b 的結果和 $a 的符號相同
<?php echo (5 % 3)."\n"; // prints 2 echo (5 % -3)."\n"; // prints 2 echo (-5 % 3)."\n"; // prints -2 echo (-5 % -3)."\n"; // prints -2 ?>
基本的賦值運算符是“=”,它實際上意味著把右邊表達式的值賦給左邊的運算數
賦值運算表達式的值也就是所賦的值。也就是說,“$a = 3”的值是 3
<?php $a = ($b = 4) + 5; // $a 現在成了 9,而 $b 成了 4。 ?>
在基本賦值運算符之外,還有適合於所有二元算術,數組集合和字符串運算符的“組合運算符”,這樣可以在一個表達式中使用它的值並把表達式的結果賦給它
x = y x += y x -= y x *= y x /= y x %= y
<?php $a = 3; $a += 5; // $a = $a + 5; $b = "Hello "; $b .= "There!"; //$b = $b . "There!"; ?>
引用賦值
PHP 支持引用賦值,引用賦值意味著兩個變量指向了同一個數據,沒有拷貝任何東西
<?php $a = 3; $b = &$a; // $b 是 $a 的引用 print "$a\n"; // 輸出 3 print "$b\n"; // 輸出 3 $a = 4; // 修改 $a print "$a\n"; // 輸出 4 print "$b\n"; // 也輸出 4,因為 $b 是 $a 的引用,因此也被改變 ?>
遞增/遞減
例子 名稱 效果 ++$a 前加 $a 的值加一,然後返回 $a $a++ 後加 返回 $a,然後將 $a 的值加一 --$a 前減 $a 的值減一, 然後返回 $a $a-- 後減 返回 $a,然後將 $a 的值減一
<?php $x=10; echo ++$x; // 輸出 11 $y=10; echo $y++; // 輸出 10 $z=5; echo --$z; // 輸出 4 $i=5; echo $i--; // 輸出 5 ?>
位運算符允許對整型數中指定的位進行求值和操作
例子 名稱 結果 $a & $b And(按位與) 將把 $a 和 $b 中都為 1 的位設為 1 $a | $b Or(按位或) 將把 $a 和 $b 中任何一個為 1 的位設為 1 $a ^ $b Xor(按位異或) 將把 $a 和 $b 中一個為 1 另一個為 0 的位設為 1 ~ $a Not(按位取反) 將 $a 中為 0 的位設為 1,反之亦然 $a << $b Shift left(左移) 將 $a 中的位向左移動 $b 次(每一次移動都表示“乘以 2”) $a >> $b Shift right(右移) 將 $a 中的位向右移動 $b 次(每一次移動都表示“除以 2”)
比較運算符,如同它們名稱所暗示的,允許對兩個值進行比較
例子 名稱 結果 $a == $b 等於 TRUE,如果類型轉換後 $a 等於 $b $a === $b 全等 TRUE,如果 $a 等於 $b,並且它們的類型也相同 $a != $b 不等 TRUE,如果類型轉換後 $a 不等於 $b $a <> $b 不等 TRUE,如果類型轉換後 $a 不等於 $b $a !== $b 不全等 TRUE,如果 $a 不等於 $b,或者它們的類型不同 $a < $b 小與 TRUE,如果 $a 嚴格小於 $b $a > $b 大於 TRUE,如果 $a 嚴格大於 $b $a <= $b 小於等於 TRUE,如果 $a 小於或者等於 $b $a >= $b 大於等於 TRUE,如果 $a 大於或者等於 $b
如果比較一個數字和字符串或者比較涉及到數字內容的字符串,則字符串會被轉換為數值並且比較按照數值來進行。此規則也適用於 switch 語句。當用 === 或 !== 進行比較時則不進行類型轉換,因為此時類型和數值都要比對
<?php var_dump(0 == "a"); // 0 == 0 -> true var_dump("1" == "01"); // 1 == 1 -> true var_dump("10" == "1e1"); // 10 == 10 -> true var_dump(100 == "1e2"); // 100 == 100 -> true switch ("a") { case 0: echo "0";//輸出0 break; case "a": echo "a"; break; } ?>
比較多種類型
運算數 1 類型 運算數 2 類型 結果 null 或 string string 將 NULL 轉換為 "",進行數字或詞匯比較 bool 或 null 任何其它類型 轉換為 bool,FALSE < TRUE object object 內置類可以定義自己的比較,不同類不能比較string、resource、number string、resource、number 將字符串和資源轉換成數字,按普通數學比較 array array 具有較少成員的數組較小,如果運算數 1 中的鍵不存在於運算數 2 中則數組無法比較,否則挨個值比較 object 任何其它類型 object 總是更大 array 任何其它類型 array 總是更大
三元運算符
"?:"三元運算符是一個比較運算符,對於表達式(expr1)?(expr2):(expr3),如果expr1的值為true,則此表達式的值為expr2,否則為expr3
<?php $a = 78;//成績 $b = $a >=60?"及格":"不及格"; echo $b;//及格 ?>
PHP 支持一個錯誤控制運算符:@。當將其放置在一個 PHP 表達式之前,該表達式可能產生的任何錯誤信息都被忽略掉
[注意]錯誤控制前綴@運算符只對表達式有效,@不會屏蔽解析錯誤的信息,不能把它放在函數或類的定義之前,也不能用於條件結構如if和foreach等
<?php $a = 1; echo @ $a;//1 $b; echo @ $b;//不報錯 ?>
例子 名稱 結果 $a and $b And(邏輯與) TRUE,如果 $a 和 $b 都為 TRUE $a or $b Or(邏輯或) TRUE,如果 $a 或 $b 任一為 TRUE $a xor $b Xor(邏輯異或) TRUE,如果 $a 或 $b 任一為 TRUE,但不同時是 ! $a Not(邏輯非) TRUE,如果 $a 不為 TRUE $a && $b And(邏輯與) TRUE,如果 $a 和 $b 都為 TRUE $a || $b Or(邏輯或) TRUE,如果 $a 或 $b 任一為 TRUE
<?php // foo() 根本沒機會被調用,被運算符“短路”了 $a = (false && foo()); $b = (true || foo()); $c = (false and foo()); $d = (true or foo()); // -------------------- // "||" 比 "or" 的優先級高 // 表達式 (false || true) 的結果被賦給 $e // 等同於:($e = (false || true)) $e = false || true; // 常量 false 被賦給 $f,true 被忽略 // 等同於:(($f = false) or true) $f = false or true; var_dump($e, $f);//bool(true) bool(false) // -------------------- // "&&" 比 "and" 的優先級高 // 表達式 (true && false) 的結果被賦給 $g // 等同於:($g = (true && false)) $g = true && false; // 常量 true 被賦給 $h,false 被忽略 // 等同於:(($h = true) and false) $h = true and false; var_dump($g, $h);//bool(false) bool(true) ?>
有兩個字符串運算符。第一個是連接運算符(“.”),它返回其左右參數連接後的字符串。第二個是連接賦值運算符(“.=”),它將右邊參數附加到左邊的參數之後
<?php $a = "Hello "; $b = $a . "World!"; // now $b contains "Hello World!" $a = "Hello "; $a .= "World!"; // now $a contains "Hello World!" ?>
例子 名稱 結果 $a + $b 聯合 $a 和 $b 的聯合 $a == $b 相等 如果 $a 和 $b 具有相同的鍵/值對則為 TRUE $a === $b 全等 如果 $a 和 $b 具有相同的鍵/值對並且順序和類型都相同則為 TRUE $a != $b 不等 如果 $a 不等於 $b 則為 TRUE $a <> $b 不等 如果 $a 不等於 $b 則為 TRUE $a !== $b 不全等 如果 $a 不全等於 $b 則為 TRUE
<?php $x = array("a" => "red", "b" => "green"); $y = array("c" => "blue", "d" => "yellow"); $z = $x + $y; var_dump($z);//array(4) { ["a"]=> string(3) "red" ["b"]=> string(5) "green" ["c"]=> string(4) "blue" ["d"]=> string(6) "yellow" } echo "<br>"; var_dump($x == $y);//bool(false) echo "<br>"; var_dump($x === $y);//bool(false) echo "<br>"; var_dump($x != $y);//bool(true) echo "<br>"; var_dump($x <> $y);//bool(true) echo "<br>"; var_dump($x !== $y);//bool(true) ?>