搞定PHP面試 - 運算子知識點整理
一、算術運算子
1. 概覽
例子 | 名稱 | 結果 |
---|---|---|
$a + $b | 加法 | $a 和 $b 的和。 |
$a - $b | 減法 | $a 和 $b 的差。 |
$a * $b | 乘法 | $a 和 $b 的積。 |
$a / $b | 除法 | $a 除以 $b 的商。 |
$a % $b | 取餘 | $a 除以 $b 的餘數。 |
-$a | 取反 | $a 的相反數。 |
2. TIPS
除法運算子總是返回浮點數。只有在下列情況例外:兩個運算元都是整數(或字串轉換成的整數)並且正好能整除,這時它返回一個整數。
取模運算子的運算元在運算之前都會轉換成整數(除去小數部分)。
取模運算子 % 的結果和被除數的符號(正負號)相同。即 $a % $b 的結果和 $a 的符號相同。例如:
echo (5 % 3)."\n"; // prints 2 echo (5 % -3)."\n"; // prints 2 echo (-5 % 3)."\n"; // prints -2 echo (-5 % -3)."\n"; // prints -2
二、位運算子
1. 概覽
例子 | 名稱 | 結果 | |
---|---|---|---|
$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”)。 |
2. TIPS
位移在 PHP 中是數學運算。
向任何方向移出去的位都被丟棄。
左移時右側以零填充,符號位被移走意味著正負號不被保留。
右移時左側以符號位填充,意味著正負號被保留。
使用位運算子時要特別注意優先順序。例如 :$a & $b == true
先進行比較再進行按位與;($a & $b) == true
則先進行按位與再進行比較。
三、比較運算子
1. 概覽
例子 | 名稱 | 結果 |
---|---|---|
$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。 |
$a <=> $b | 太空船運算子(組合比較符) | 當$a小於、等於、大於$b時 分別返回一個小於、等於、大於0的integer 值。 PHP7開始提供 |
$a ?? $b ?? $c | NULL 合併操作符 | 從左往右第一個存在且不為 NULL 的運算元。如果都沒有定義且不為 NULL,則返回 NULL。PHP7開始提供。 |
2. TIPS
如果比較一個數字和字串或者比較涉及到數字內容的字串,則字串會被轉換為數值並且比較按照數值來進行。此規則也適用於 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";
break;
case "a": // 永遠不會到達a,因為 "a" 已經與 0 匹配
echo "a";
break;
}
?>
3. 對於多種型別,比較運算子根據下表比較(按順序)
運算數1型別 | 運算數2型別 | 結果 |
---|---|---|
null 或 string | string | 將 NULL 轉換為 "",進行數字或詞彙比較 |
bool 或 null | 任何其它型別 | 轉換為 bool,FALSE < TRUE |
object | object | 內建類可以定義自己的比較,不同類不能比較,相同類和陣列同樣方式比較屬性(PHP 4 中),PHP 5 有其自己的說明 |
string,resource 或 number | string,resource 或 number | 將字串和資源轉換成數字,按普通數學比較 |
array | array | 具有較少成員的陣列較小,如果運算數 1 中的鍵不存在於運算數 2 中則陣列無法比較,否則挨個值比較(見下例) |
object | 任何其它型別 | object 總是更大 |
array | 任何其它型別 | array 總是更大 |
4. 鬆散比較表
\ | 1 | 0 | -1 | "1" | "0" | "-1" | NULL | array() | "php" | "" |
---|---|---|---|---|---|---|---|---|---|---|
TRUE | √ | × | √ | √ | × | √ | × | × | √ | × |
FALSE | × | √ | × | × | √ | × | √ | √ | × | √ |
1 | × | × | √ | × | × | × | × | × | × | |
0 | × | × | √ | × | √ | × | √ | √ | ||
-1 | × | × | √ | × | × | × | × | |||
"1" | × | × | × | × | × | × | ||||
"0" | × | × | × | × | × | |||||
"-1" | × | × | × | × | ||||||
NULL | √ | × | √ | |||||||
array() | × | × | ||||||||
"php" | × |
四、遞增/遞減運算子
1. 概覽
例子 | 名稱 | 效果 |
---|---|---|
++$a | 前加 | $a 的值加一,然後返回 $a。 |
$a++ | 後加 | 返回 $a,然後將 $a 的值加一。 |
--$a | 前減 | $a 的值減一, 然後返回 $a。 |
$a-- | 後減 | 返回 $a,然後將 $a 的值減一。 |
2. TIPS
遞增/遞減運算子不影響布林值。
遞減 NULL 值也沒有效果,但是遞增 NULL 的結果是 1。
在處理字元變數的算數運算時,PHP 沿襲了 Perl 的習慣,而非 C 的。
例如,在 Perl 中 $a = 'Z'; $a++; 將把 $a 變成'AA',而在 C 中,a = 'Z'; a++; 將把 a 變成 '['('Z' 的 ASCII 值是 90,'[' 的 ASCII 值是 91)。
注意字元變數只能遞增,不能遞減,並且只支援純字母(a-z 和 A-Z)。
遞增/遞減其他字元變數則無效,原字串沒有變化。
五、邏輯運算子
1. 概覽
例子 | 名稱 | 結果 |
---|---|---|
$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。 |
2. TIPS
“與”和“或”有兩種不同形式運算子的原因是它們運算的優先順序不同。
// "&&" 比 "and" 的優先順序高
// 表示式 (true && false) 的結果被賦給 $g
// 等同於:($g = (true && false))
$g = true && false;
// 常量 true 被賦給 $h,false 被忽略
// 等同於:(($h = true) and false)
$h = true and false;
六、陣列運算子
1. 概覽
例子 | 名稱 | 結果 |
---|---|---|
$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。 |
2. TIPS
陣列中的單元如果具有相同的鍵名和值則比較時相等
$a = array("apple", "banana");
$b = array(1 => "banana", "0" => "apple");
var_dump($a == $b); // bool(true)
var_dump($a === $b); // bool(false)
+ 運算子
和 array_merge()
的區別
當陣列下標為字元時,遇到相同鍵名,+ 運算子
會拋棄掉後面的值; array_merge()
會用後面的值覆蓋前面的值。
當陣列下標為數值時, array_merge()
會保留所有的值,並重新索引陣列。+ 運算子
同樣會拋棄掉後面具有相同下標的值。
$arr1 = ['color' => 'red', 10, 20];
$arr2 = [0, 1, 'color' => 'green'];
print_r($arr1 + $arr2);
print_r(array_merge($arr1, $arr2));
輸出:
Array ( [color] => red [0] => 10 [1] => 20 )
Array ( [color] => green [0] => 10 [1] => 20 [2] => 0 [3] => 1 )
七、運算子優先順序
1. 概覽
結合方向 | 運算子 | 附加資訊 |
---|---|---|
無 | clone new | clone 和 new |
左 | [ | array() |
右 | ** | 算術運算子 |
右 | ++ -- ~ (int) (float) (string) (array) (object) (bool) @ | 型別和遞增/遞減 |
無 | instanceof | 型別 |
右 | ! | 邏輯運算子 |
左 | * / % | 算術運算子 |
左 | + - . | 算術運算子和字串運算子 |
左 | << >> | 位運算子 |
無 | < <= > >= | 比較運算子 |
無 | == != === !== <> <=> | 比較運算子 |
左 | & | 位運算子和引用 |
左 | ^ | 位運算子 |
左 | | | 位運算子 |
左 | && | 邏輯運算子 |
左 | || | 邏輯運算子 |
左 | ?? | 比較運算子 |
左 | ? : | ternary |
右 | = += -= = *= /= .= %= &= |= ^= <<= >>= | 賦值運算子 |
左 | and | 邏輯運算子 |
左 | xor | 邏輯運算子 |
左 | or | 邏輯運算子 |
2. TIPS
如果運算子優先順序相同,那運算子的結合方向決定了該如何運算。例如,"-"是左聯的,那麼 1 - 2 - 3 就等同於 (1 - 2) - 3 並且結果是 -4. 另外一方面,"="是右聯的,所以 $a = $b = $c 等同於 $a = ($b = $c)。
沒有結合的相同優先順序的運算子不能連在一起使用,例如 1 < 2 > 1 在PHP是不合法的。但另外一方面表示式 1 <= 1 == 1 是合法的, 因為 == 的優先順序低於 <=。
括號的使用,哪怕在不是必要的場合下,通過括號的配對來明確標明運算順序,而非靠運算子優先順序和結合性來決定,通常能夠增加程式碼的可讀性。
著重記憶:
遞增/遞減
> !
> 算術運算子
> 大小比較
> (不)相等比較
> 引用
> 位運算子(^)
> 位運算子(|)
> 邏輯與
> 邏輯或
> 三目
> 賦值
> and
> xor
> or
3. 實戰例題
請寫出下列程式輸出的結果
$a = 0;
$b = 0;
if ($a = 3 > 0 || $b = 3 > 0)
{
$a++;
$b++;
echo $a. "\n";
echo $b. "\n";
}
例題分析
1.題目中包含 =
>
||
三種運算子,優先順序順序為 >
> ||
> =
2.$a = 3 > 0 || $b = 3 > 0
等價於 $a = ( ( 3 > 0 ) || $b = ( 3 > 0 ) )
3.( 3 > 0 )
為 true,因此不會再運算 ||
後面的式子
4.$a = true,所以程式可以改寫為
$a = 0;
$b = 0;
if ($a = true)
{
$a++;
$b++;
echo $a. "\n";
echo $b. "\n";
}
5.因為 “遞增/遞減運算子不影響布林值”,所以 $a++
後,$a 的值依然是 true,echo true
,會輸出 1
6.因為 $b = 0
,所以 $b++
後,$b 的值為 1
7.輸出結果為
1
1
原文地址:https://segmentfault.com/a/1190000016281794