文章目錄
- 一、運算子的優先順序
- 二、算術運算子
- 三、賦值運算子
- 四、位元運算符
- 五、比較子
- 六、錯誤控制運算子
- 七、執行運算子
- 八、加一/減一運算子
- 九、邏輯運算子
- 九、字串運算子
- 九、數組運算子
一、運算子的優先順序
運算子優先順序指定了兩個運算式綁定得有多“緊密”。例如,運算式 1 + 5 * 3 的結果是 16 而不是 18 是因為乘號(“*”)的優先順序比加號(“+”)高。必要時可以用括弧來強制改變優先順序。例如:(1 + 5) * 3 的值為 18。
下表從低到高列出了運算子的優先順序。
結合方向 |
運算子 |
左 |
, |
左 |
or |
左 |
xor |
左 |
and |
右 |
print |
右 |
= += -= *= /= .= %= &= |= ^= ~= <<= >>= |
左 |
? : |
左 |
|| |
左 |
&& |
左 |
| |
左 |
^ |
左 |
& |
無 |
== != === !== |
無 |
< <= > >= |
左 |
<< >> |
左 |
+ - . |
左 |
* / % |
右 |
! ~ ++ -- (int) (float) (string) (array) (object) @ |
右 |
[ |
無 |
new |
注: 儘管 ! 比 = 的優先順序高,PHP 仍舊允許類似如下的運算式
二、算術運算子
例子 |
名稱 |
結果 |
$a + $b |
加法 |
$a 和 $b 的和。 |
$a - $b |
減法 |
$a 和 $b 的差。 |
$a * $b |
乘法 |
$a 和 $b 的積。 |
$a / $b |
除法 |
$a 除以 $b 的商。 |
$a % $b |
模數 |
$a 除以 $b 的餘數。 |
除號(“/”)總是返回浮點數,即使兩個運算數是整數(或由字串轉換成的整數)也是這樣。
三、賦值運算子
基本的賦值運算子是“=”。你一開始可能會以為它是“等於”,其實不是的。它實際上意味著把右邊運算式的值賦給左運算數。
賦值運算運算式的值也就是所賦的值。也就是說,“$a = 3”的值是 3。這樣就可以使你做一些小技巧:
$a = ($b = 4) + 5; // $a is equal to 9 now, and $b has been set to 4.
在基本賦值運算子之外,還有適合於所有二元算術和字串運算子的“組和運算子”,這可以讓你在一個運算式中使用它的值並把運算式的結果賦給它,例如:
$a = 3;<br />$a += 5; // sets $a to 8, as if we had said: $a = $a + 5;<br />$b = "Hello ";<br />$b .= "There!"; // sets $b to "Hello There!", just like $b = $b . "There!";
注意:賦值運算將原變數的值拷貝到新變數中(傳值賦值),所以改變其中一個並不影響另一個。這也適合於你在在緊密迴圈中拷貝一些值例如大數值。PHP 4 支援引用賦值,用 $var = &$othervar; 文法,但在 PHP 3 中不可能這樣做。“引用賦值”意味著兩個變數都指向同一個資料,沒有任何資料的拷貝。
四、位元運算符
運算子允許對整型數中指定的位進行置位。如果左右參數都是字串,則位元運算符將操作這個字串中的字元。
<?php<br /> echo 12 ^ 9; // Outputs '5'</p><p> echo "12" ^ "9"; // Outputs the Backspace character (ascii 8)<br /> // ('1' (ascii 49)) ^ ('9' (ascii 57)) = #8</p><p> echo "hallo" ^ "hello"; // Outputs the ascii values #0 #4 #0 #0 #0<br /> // 'a' ^ 'e' = #4<br />?>
位元運算的表格如下:
例子 |
名稱 |
結果 |
$a & $b |
And(按位與) |
將在 $a 和 $b 中都為 1 的位設為 1。 |
$a | $b |
Or(按位或) |
將在 $a 或者 $b 中為 1 的位設為 1。 |
$a ^ $b |
Xor(按位異或) |
將在 $a 和 $b 中不同的位設為 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,並且它們的類型也相同。(PHP 4 only) |
$a != $b |
不等 |
TRUE,如果 $a 不等於 $b。 |
$a <> $b |
不等 |
TRUE,如果 $a 不等於 $b。 |
$a !== $b |
非全等 |
TRUE,如果 $a 不等於 $b,或者它們的類型不同。(PHP 4 only) |
$a < $b |
小與 |
TRUE,如果 $a 嚴格小於 $b。 |
$a > $b |
大於 |
TRUE,如果 $a 嚴格 $b。 |
$a <= $b |
小於等於 |
TRUE,如果 $a 小於或者等於 $b。 |
$a >= $b |
大於等於 |
TRUE,如果 $a 大於或者等於 $b。 |
另外一個條件運算子是“?:”(或三元)運算子,它和 C 以及很多其它語言的操作一樣。
<?php<br />// Example usage for: Ternary Operator<br />$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];</p><p>// The above is identical to this if/else statement<br />if (empty($_POST['action'])) {<br /> $action = 'default';<br />} else {<br /> $action = $_POST['action'];<br />}<br />?>
對於運算式 (expr1) ? (expr2) : (expr3),如果 expr1 的值為 TRUE,則此運算式的值為 expr2,如果 expr1 的值為 FALSE,則此運算式的值為 expr3。
六、錯誤控制運算子
PHP 支援一個錯誤控制運算子:@。當將其放置在一個 PHP 運算式之前,該運算式可能產生的任何錯誤資訊都被忽略掉。
如果啟用了 track_errors 特性,運算式所產生的任何錯誤資訊都被存放在變數 $php_errormsg 中。此變數在每次出錯時都會被覆蓋,所以如果想用它的話就要儘早檢查。
<?php<br />/* Intentional file error */<br />$my_file = @file ('non_existent_file') or<br /> die ("Failed opening file: error was '$php_errormsg'");</p><p>// this works for any expression, not just functions:<br />$value = @$cache[$key];<br />// will not issue a notice if the index $key doesn't exist.</p><p>?>
注: @ 運算子只對錶達式有效。對新手來說一個簡單的規則就是:如果你能從某處得到值,你就能在它前面加上 @ 運算子。例如,你可以把它放在變數,函數和 include() 調用,常量,等等之前。不能把它放在函數或類的定義之前,也不能用於條件結構例如 if 和 foreach 等。
警告:目前的“@”錯誤控制運算子首碼甚至使導致指令碼終止的嚴重錯誤的錯誤報表也失效。這意味著如果你在某個不存在或類型錯誤的函數調用前用了“@”來抑制錯誤資訊,那指令碼會沒有任何跡象顯示原因而死在那裡。
七、執行運算子
PHP 支援一個執行運算子:反引號(``)。注意這不是單引號!PHP 將嘗試將反引號中的內容作為外殼命令來執行,並將其輸出資訊返回(例如,可以賦給一個變數而不是簡單地丟棄到標準輸出)。使用反引號運算子“`”的效果與函數 shell_exec() 相同。
<?php<br />$output = `ls -al`;<br />echo "<pre>$output</pre>";<br />?>
注: 反引號運算子在啟用了 安全模式 或者關閉了 shell_exec() 時是無效的。
八、加一/減一運算子
PHP 支援 C 風格的前/後加一與減一運算子。
例子 |
名稱 |
效果 |
++$a |
前加 |
$a 的值加一,然後返回 $a。 |
$a++ |
後加 |
返回 $a,然後將 $a 的值加一。 |
--$a |
前減 |
$a 的值減一, 然後返回 $a。 |
$a-- |
後減 |
返回 $a,然後將 $a 的值減一。 |
一個簡單的樣本指令碼:
<?php<br />echo "<h3>Postincrement</h3>";<br />$a = 5;<br />echo "Should be 5: " . $a++ . "<br />/n";<br />echo "Should be 6: " . $a . "<br />/n";</p><p>echo "<h3>Preincrement</h3>";<br />$a = 5;<br />echo "Should be 6: " . ++$a . "<br />/n";<br />echo "Should be 6: " . $a . "<br />/n";</p><p>echo "<h3>Postdecrement</h3>";<br />$a = 5;<br />echo "Should be 5: " . $a-- . "<br />/n";<br />echo "Should be 4: " . $a . "<br />/n";</p><p>echo "<h3>Predecrement</h3>";<br />$a = 5;<br />echo "Should be 4: " . --$a . "<br />/n";<br />echo "Should be 4: " . $a . "<br />/n";<br />?>
在處理字元變數的算數運算時,PHP 沿襲了 Perl 的習慣,而非 C 的。例如,在 Perl 中 'Z'+1 將得到 'AA',而在 C 中,'Z'+1 將得到 '[' { ord('Z') == 90, ord('[') == 91 )。
代碼1:涉及字元變數的算數運算
<?php<br />$i = 'W';<br />for($n=0; $n<6; $n++)<br /> echo ++$i . "/n";</p><p>/*<br /> Produces the output similar to the following:</p><p>X<br />Y<br />Z<br />AA<br />AB<br />AC</p><p>*/<br />?>
九、邏輯運算子
“與”和“或”有兩種不同形式運算子的原因是它們操作的優先順序不同。
例子 |
名稱 |
結果 |
$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。 |
九、字串運算子
有兩個字串運算子。第一個是串連運算子(“.”),它返回其左右參數串連後的字串。第二個是串連賦值運算子(“.=”),它將右邊參數附加到左邊的參數後。
$a = "Hello ";<br />$b = $a . "World!"; // now $b contains "Hello World!"</p><p>$a = "Hello ";<br />$a .= "World!"; // now $a contains "Hello World!"
九、數組運算子
PHP 僅有的一個數組運算子是 + 運算子。它把右邊的數組附加到左邊的數組後,但是重複的索引值不會被覆蓋。
$a = array("a" => "apple", "b" => "banana");<br />$b = array("a" =>"pear", "b" => "strawberry", "c" => "cherry");</p><p>$c = $a + $b;</p><p>var_dump($c);
執行後,此指令碼會顯示:
array(3) {
["a"]=>
string(5) "apple"
["b"]=>
string(6) "banana"
["c"]=>
string(6) "cherry"
}