搞定PHP面試 - 運算符知識點整理

1、算術運算符

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

除法運算符老是返回浮點數。只有在下列狀況例外:兩個操做數都是整數(或字符串轉換成的整數)而且正好能整除,這時它返回一個整數。php

取模運算符的操做數在運算以前都會轉換成整數(除去小數部分)。數組

取模運算符 % 的結果和被除數的符號(正負號)相同。即 $a % $b 的結果和 $a 的符號相同。例如:app

echo (5 % 3)."\n";        // prints 2
echo (5 % -3)."\n";        // prints 2
echo (-5 % 3)."\n";        // prints -2
echo (-5 % -3)."\n";       // prints -2

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 中是數學運算。
向任何方向移出去的位都被丟棄。
左移時右側以零填充,符號位被移走意味着正負號不被保留。
右移時左側以符號位填充,意味着正負號被保留。.net

使用位運算符時要特別注意優先級。例如 :
$a & $b == true 先進行比較再進行按位與;
($a & $b) == true 則先進行按位與再進行比較。code

3、比較運算符

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" ×

4、遞增/遞減運算符

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)。
遞增/遞減其餘字符變量則無效,原字符串沒有變化。資源

5、邏輯運算符

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

「與」和「或」有兩種不一樣形式運算符的緣由是它們運算的優先級不一樣。rem

// "&&" 比 "and" 的優先級高

// 表達式 (true && false) 的結果被賦給 $g
// 等同於:($g = (true && false))
$g = true && false;

// 常量 true 被賦給 $h,false 被忽略
// 等同於:(($h = true) and false)
$h = true and false;

6、數組運算符

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));

輸出:get

Array ( [color] => red [0] => 10 [1] => 20 ) 
Array ( [color] => green [0] => 10 [1] => 20 [2] => 0 [3] => 1 )

7、運算符優先級

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
相關文章
相關標籤/搜索