【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 '其他';
}

<<:  第一次接触 Laravel

>>:  D21 Django-bootstrap 网站美化工程 (1)

在 Lubuntu 18.04 上安装 CodeBlocks IDE 17.12

写程序,弄个 IDE 真的会方便不少,如果您是要在 ubuntu 20.04 上面使用 Code::...

自动化测试,让你上班拥有一杯咖啡的时间 | Day 24 - 学习 trigger 的用法

此系列文章会同步发文到个人部落格,有兴趣的读者可以前往观看喔。 今天要跟大家分享当网页上有子表时,...

< 关於 React: 开始打地基| 如何创立一个新专案>

09-02-2021 如何开始使用React 本章内容 将React加到网页中 只需部分使用时 建立...

Day 11 : 用於生产的机械学习 - Data Labeling 资料标注

标注资料与特徵工程是处理资料重要的步骤,目的都是为了让模型效果最佳化,标注的一致性、特徵工程到位都对...

JavaScript学习日记 : Day18 - Class

在平时开发时,我们会遇到要创建许多类型相似的object,之前的文章有提到使用new操作符配合fun...