這個章節要介紹的是 Operators (運算符號),
運算符號可以有很多種形式,除了一些在 PHP 內才能使用的運算符號之外,例如:. 可以將字串相加…
除了那些特例之外,在通常的情況下,這些運算符號也都同樣可以運用在其他的程式語言上~
而在這章節,我主要會分成 12 個小部分來討論:
- Operator Precedence
- Arithmetic Operators
- Assignment Operators
- Bitwise Operators
- Comparison Operators
- Error Control Operators
- Execution Operators
- Incrementing/Decrementing Operators
- Logical Operators
- String Operators
- Array Operators
- Type Operators
Operator Precedence
首先,我們會先提到運算元的優先順序。
就像以前學過的先乘除後加減一樣,在運算式裡也同樣是這樣~
也可以透過() 括號來完成符合期望的計算式
1 | $var = 1 + 2 * 3; |
Arithmetic Operators
接續前一部分,這邊要提到的是算數運算符號,就是加減乘除…等算數運算符號。
而在 PHP 或是其他程式語言當中就是 +-*/
而除法又可以分為 / 和 %
它們的差異在於:
當你使用 / 的時候,會得到計算完的商數
在數字無法整除的情況下,使用 / 符號做除法運算會回傳浮點數型態1
2$var = 7 / 2;
echo $var; // 3.5而使用 % 做除法的時候,會得到計算完的餘數
1
2$var = 7 % 2;
echo $var; // 1
另外要提到 ** 這個算數運算符號,它在 PHP 當中代表的是次方的意思。
詳細請看下方範例說明~1
2$var = 2 ** 3;
echo $var; // 8
適當的使用這些算數運算符號可以幫助我們寫出更精簡且更正確的運算式~
Assignment Operators
再來要提到的是分配運算符號,顧名思義就是賦予變數/常數數值得運算符號。
= 就是屬於這類的運算符號。
在之前第 4 章介紹 Expressions 的時候,我們有提到使用結合運算符號的方式去簡化表達式
像這類結合的也可以拆分成分配的運算式。
例如:
$var = 2; 等同於 $var = $var 2;
不過在多數時候,應該多數人會採用前面的寫法,能夠更加方便快速的完成一個計算式~
Bitwise Operators
接下來是位元運算符號,這個部分需要先了解一下什麼是 2 進位~
2 進位就是將某一個數字以 0 和 1 (不超過 2) 的方式做轉換
而數字由右到左分別代表 2 的 0, 1 … 次方
將這些計算得到的數字加總即可。
用範例可以說明得更加清楚~
例如:
數字 5 的 2 進位就是 101
就是 2 的0次方加上 2 的2次方就會等於 5
由右到左是 0, 1, 2,而數字 1 代表這個部分有值,因此就會是 2 的 0次方和 2次方
在了解 2 進位之後,再接續看位元運算符號的部分
(在儲存 2進位的數值時,要記得在最前面加上 0,這樣數值才會被辨識為 2進位)
1. & (And)
當使用 & 的時候,只有當兩個 2進位數值都是 1的時候,才會為 1。1
2
3
4$a = 0111;
$b = 0010;
$var = $a & $b; // 0010
echo $var; // 2
2. | (Or)
當使用 | 的時候,只要任一個數值是 1,出來的結果就會為 1。1
2
3
4$a = 0111;
$b = 0010;
$var = $a | $b; // 0111
echo $var; // 7
3. ^ (Xor)
當使用 ^ 的時候,只有其中一個數值是 1的情況下,才會為 1,當兩個數值都同樣是 1的時候,就會為 0。1
2
3
4$a = 0111;
$b = 0010;
$var = $a ^ $b; // 0101
echo $var; // 5
4. ~ (Not)
當使用 ~ 的時候,會將數值 1 和 0 調換,換言之就是將數值 1 變成 0、0 變成 1。1
2
3$a = 0010;
$var = ~$a; // 1101
echo $var; // 13
5. << (Shift left)
當使用 << 的時候,會將 2 進位數值進行向左移動的調整,並遞補上 0,調整的位數由右邊的數字決定。1
2
3$a = 0010;
$var = $a << 2; // 1000
echo $var; // 8
6. >> (Shift right)
當使用 << 的時候,會將 2 進位數值進行向右移動的調整,並遞補上 0,調整的位數由左邊的數字決定。1
2
3$a = 0010;
$var = $a >> 1; // 0001
echo $var; // 1
Comparison Operators
緊接著,我們要談到比較運算符號~
簡單來說就是用來比較 2變數的關係,並根據結果回傳 TRUE 或 FALSE。
底下用條列的方式簡單列出各種比較運算符號:
- ==
用來判斷 2變數的數值是否相等。 - ===
用來判斷 2變數的數值以及型態是否都相等 - != 也可以使用 <>
用來判斷 2變數的數值是否不相等 - !==
用來比較 2變數的數值以及型態是否都不相等 - <
用來比較左邊變數的數值是否小於右邊變數的數值 =
用來比較左邊變數的數值是否大於等於右邊變數的數值- <=
用來比較左邊變數的數值是否小於等於右邊變數的數值 - <=>
對兩邊的變數進行 3重判斷。 - 當兩邊數值相同的時候,會回傳 0
- 當左邊數值比較大的時候,會回傳 1
- 當右邊數值比較大的時候,會回傳 -1
Error Control Operators
這裡我們要提到錯誤控制運算符號。
當我們不希望後面的運算式發出錯誤訊息進而中斷程式的執行時
可以加上 @ 符號,它會自動忽略後續表達式所產生出來的錯誤訊息1
echo @$values['name'];
與之相對的是,我們可以使用 try catch 的方式來抓取程式碼產生的錯誤,並加以處理,避免程式碼發生錯誤中斷執行。
而這會在之後的章節中提到~
Execution Operators
再來~ 這部分要討論的是執行運算符號。
在 PHP 中使用 ` 符號(注意不是 ‘ )的時候,PHP 會試圖用 shell command (命令提示字元) 的方式去執行裡面的程式碼
你也可以使用 shell_exec() 函式達到同樣的效果~
Incrementing/Decrementing Operators
接下來的這部分要談到遞增/遞減運算符號,也可以區分成前置運算符和後置運算符
像之前的章節曾經提過的
++$var、–$var
$var++、$var–
對運算都會有不同的效果,這邊就不在多做解釋了~
想要了解的人可以參考第 4 章 PHP-Expressions~
Logical Operators
這部分要談的是邏輯運算符號,和位元運算符號有點類似,但實際是很不一樣的!
邏輯運算符號主要是用來判斷兩邊條件式的結果,再依據結果回傳 TRUE 或 FALSE。
而位元運算符號是針對 2進位的數值進行調整、計算,回傳的結果也會是數值。
1. && 也可以寫成 and
當兩邊條件式都為 TRUE 的情況下,才會為 TRUE。1
2
3$a = 3;
$b = 5;
echo ($a > 0) && ($b > 0); // TRUE
2. || 也可以寫成 or
當兩邊條件式其中一個為 TRUE 的情況下,結果就會為 TRUE。1
2
3$a = 3;
$b = 5;
echo ($a > 0) || ($b < 0); // TRUE
3. xor
當兩邊條件式只有一個為 TRUE 的情況下,才會為 TRUE,若兩個都為 TRUE,則結果會為 FALSE。1
2
3$a = 3;
$b = 5;
echo ($a > 0) xor ($b > 0); // FALSE
4. ! (not)
將調建式的結果做轉換,換言之就是將 TRUE 轉為 FALSE;FALSE 轉為 TRUE1
2$a = 3;
echo !($a < 0); // TRUE
String Operators
在這部分要談到字串運算符號
其實就是 . 和 .=
透過這種方式可以將兩個字串做相加1
2
3$var = "hello";
$var .= " world";
echo $var; // "hello world"
Array Operators
接下來的這部分則是談到陣列運算符號
判斷的方式和前面提過的相同,這部分主要是要說明這些運算符號也同樣可以使用在陣列上
下方用條列方式列出相關運算符號:
- +
將兩陣列元素相加 - ==
比較兩陣列是否有相同的元素 - ===
比較兩陣列在相同的位置上是否有相同的元素 - != 也可以寫成 <>
比較兩陣列元素是否不相同 - !==
比較兩陣列在相同的位置上是否有不一樣的元素
Type Operators
終於到了最後一個部分了~
最後我們要提到的是型態運算符號,也可以說是關鍵字
當我們想知道某個物件是否由某類別所實做,可以使用 instanceof 做判斷。1
2
3
4
5
6
7
8
9
10class classOne{
// do something...
}
class classTwo{
// do something...
}
$obj = new classOne();
echo $obj instanceof classOne; // TRUE
echo $obj instanceof classTwo; // FALSE
透過這種方式,我們可以了解該物件是屬於哪個類別,並做後續的程式處理~