前面介紹的程式都只有單一路徑,今天要來講更複雜的多路徑的情況
比較運算子 | 說明 | 用法 |
---|---|---|
== |
a 和 b 相同,返回 true | $a == $b |
=== |
同 == |
$a === $b |
!= |
a 和 b 不相同,返回 true | $a != $b |
!== |
同 !== |
$a != $b |
邏輯運算子 | 說明 | 用法 |
---|---|---|
and |
a 和 b 都是 true,返回 true | $a and $b |
&& |
同 and |
$a && $b |
or |
a 或 b 其中一個是 true,返回 true | $a or $b |
` | ` | |
xor |
同 != ,且可以連續使用 |
$a xor $b |
! |
反轉,true -> false,false -> true | !$a |
優先順序 | 結合性 |
---|---|
** |
右 |
+a -a ++a --a |
- |
!a |
- |
* / % |
左 |
+ - |
左 |
== != === !== <> <=> |
- |
&& |
左 |
` | |
= += -= *= ... |
右 |
and |
左 |
xor |
左 |
or |
左 |
越上面越優先,如果在同一排就看結合性
$a = 10;
$b = 15;
$c = 20;
var_dump($b === $a + 6 - 2 + 1); // true
var_dump($b === $a + 5 and $c - $b * 2 === -$a); // true
var_dump(100 === -$a ** 2); // false
+
-
比 ===
優先,至於是 $a + 6
還是 6 - 2
先,就要看結合性,+
-
是左結合表示左邊 $a + 6
先做,另外兩個就換你想想看啦
所有運算子的優先順序:https://www.php.net/manual/en/language.operators.precedence.php
短路
and 在左方為 false 時,不再繼續往右運算
function a(){
echo 'a';
return false;
}
a() and a() and a(); // a
or 在左方為 true 時,不再繼續往右運算
function b(){
echo 'b';
return true;
}
b() or b() or b(); // b
xor 則沒有短路
function c() {
echo 'c';
return false;
}
c() xor c() xor b() xor a(); // ccba
二元運算子 | 說明 | 用法 |
---|---|---|
?: |
(bool)$a 為 true 時返回 $a ,否則返回 $b |
$a ?: $b |
?? |
$a 不存在或為 null 時返回 $b ,否則返回 $a |
$a ?? $b |
??= |
等同 $a = $a ?? $b |
$a ??= $b |
三元運算子 | 說明 | 用法 |
---|---|---|
?: |
(bool)$a 為 true 時返回 $b ,否則返回 $c |
$a ? $b : $c |
$a
為 0
"0"
""
[]
null
false
時,(bool)$a
為 false
單向選擇結構 if...
如果小括號中的運算結果為 true,就會執行大括號裡面的程式
$walk_to_school = true;
$will_raining_today = true;
if ($walk_to_school and $will_raining_today) {
echo '帶傘出門';
}
雙向選擇結構 if...else...
如果小括號中的運算結果為 true,就會執行 if 裡面的程式,不然就執行 else 裡的程式
$math_score = 40;
if ($math_score < 60) {
echo '數學不及格';
} else {
echo '數學及格';
}
多向選擇結構 if...elseif...else...
從上到下一一檢查,如果有一個是 true,就會執行其中的程式
以下的程式不管 $num
為多少,都不會印出 Fizz Buzz
,你知道為什麼嗎?
$num = 3;
if ($num % 3 === 0) { // 3 的倍數
echo 'Fizz';
} elseif ($num % 5 === 0) { // 5 的倍數
echo 'Buzz';
} elseif ($num % 15 === 0) { // 15 的倍數
echo 'Fizz Buzz';
} else {
echo $num;
}
巢狀選擇結構 if () {if...else...}
多層的 if else,寫在一起
$math_score = 40;
if ($math_score < 0 or $math_score > 100) {
echo '輸入錯誤';
} else {
if ($math_score > 90) {
echo 'A';
} elseif ($math_score > 80) {
echo 'B';
} elseif ($math_score > 70) {
echo 'C';
} elseif ($math_score > 60) {
echo 'D';
} else {
echo 'F';
}
}
我比較偏好寫成非巢狀,像這樣:
$math_score = 40;
if ($math_score < 0 or $math_score > 100) {
echo '輸入錯誤';
return;
}
if ($math_score > 90) {
echo 'A';
return;
}
if ($math_score > 80) {
echo 'B';
return;
}
if ($math_score > 70) {
echo 'C';
return;
}
if ($math_score > 60) {
echo 'D';
return;
}
echo 'F';
return;
多向選擇結構 switch...case...default...
switch 不像 if else 那樣一個個的比對,而是直接找到對應的位置執行,之後繼續往下執行直到遇到 break 或區塊結束
$something = 'apple'; // 外面紅色的裡面黃色的水果
switch ($something) {
case 'apple':
echo '外面紅色的';
case 'banana':
echo '裡面黃色的';
echo '水果';
break;
case 'bag':
case 'book':
echo '物品';
break;
case 'cat':
echo '動物';
break;
default:
echo '其他';
}