iT邦幫忙

2021 iThome 鐵人賽

DAY 18
0
Software Development

用 PHP 打造專屬於自己的 Telegram 聊天機器人吧!系列 第 18

【PHP Telegram Bot】Day18 - 基礎(7):邏輯運算與流程控制

前面介紹的程式都只有單一路徑,今天要來講更複雜的多路徑的情況

運算子

比較運算子 說明 用法
== 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
|| or $a || $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

$a0 "0" "" [] null false 時,(bool)$afalse


流程控制

單向選擇結構 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 '其他';
}

上一篇
【PHP Telegram Bot】Day17 - 基礎(6):函式與作用域
下一篇
【PHP Telegram Bot】Day19 - 基礎(8):迴圈、Xdebug
系列文
用 PHP 打造專屬於自己的 Telegram 聊天機器人吧!30

尚未有邦友留言

立即登入留言