3、运算符与表达式:算术运算符、赋值运算符、比较运算符、逻辑运算符、字符串运算符、错误控制运算符、三元运算符

运算符这东西,说白了就是让数据「动起来」的工具。我刚开始学PHP时,总觉得运算符就是加减乘除,后来才发现——嗯,它远比我想象的丰富。今天咱们就把PHP里最常用的几类运算符捋一遍。

3.1 算术运算符:最基础的数学活儿

算术运算符就是咱们小学就认识的加减乘除。在PHP里,它们长这样:

$a = 10;
$b = 3;

echo $a + $b;  // 13
echo $a - $b;  // 7
echo $a * $b;  // 30
echo $a / $b;  // 3.3333333333333
echo $a % $b;  // 1(取余数)
echo $a ** $b; // 1000(10的3次方)

这里有个坑,我踩过好几次——除法运算的结果可能是浮点数。比如10/3,结果不是3,而是3.333...。如果你想要整数结果,得用intdiv()函数。

小技巧:取余运算符%在判断奇偶数时特别好用。比如 $num % 2 == 0 就是偶数,否则是奇数。我在做分页功能时经常用它。

3.2 赋值运算符:不只是等号

很多人以为赋值就是「=」,其实PHP提供了很多「偷懒」的写法。我个人习惯用复合赋值运算符,代码写起来快很多。

$x = 10;
$x += 5;   // 等价于 $x = $x + 5,结果是15
$x -= 3;   // 12
$x *= 2;   // 24
$x /= 4;   // 6
$x %= 3;   // 0
$x .= 'abc'; // 字符串拼接赋值,等价于 $x = $x . 'abc'

你想想看,每次写 $x = $x + 5 多啰嗦。用 += 一行搞定,代码也更清爽。

注意:赋值运算符有返回值。比如 $a = ($b = 5) 这种写法,$b先被赋值为5,然后整个表达式返回5,再赋给$a。链式赋值虽然能用,但可读性差,我建议少用。

3.3 比较运算符:判断的核心

比较运算符返回布尔值——true或false。这里有个经典问题:== 和 === 有什么区别?

运算符 名称 示例 结果
== 等于(只比较值) 5 == "5" true
=== 全等于(比较值和类型) 5 === "5" false
!= 不等于 5 != "5" false
!== 不全等于 5 !== "5" true
< 小于 3 < 5 true
> 大于 3 > 5 false

我曾经在项目中犯过一个低级错误——用 == 判断用户输入的密码是否和数据库里的一致。结果用户输入"0"居然通过了验证,因为数据库里存的是空字符串,而空字符串 == 0 是true。从那以后,我所有比较都用 ===,再也没出过这种问题。

核心原则:能用 === 就别用 ==。类型安全比省那几个字符重要得多。

3.4 逻辑运算符:组合条件

逻辑运算符用来组合多个条件判断。常用的有三个:

$age = 25;
$hasID = true;

// &&(与):两个条件都成立才为true
if ($age >= 18 && $hasID) {
    echo "可以进入";
}

// ||(或):只要一个条件成立就为true
if ($age < 12 || $age > 60) {
    echo "享受优惠";
}

// !(非):取反
if (!$hasID) {
    echo "请出示证件";
}

这里有个性能小技巧——短路求值。比如用 && 时,如果第一个条件已经是false,PHP就不会再判断第二个条件了。我写代码时,习惯把计算量小的条件放前面,能省点性能。

避坑指南:and 和 or 也是逻辑运算符,但优先级比 && 和 || 低。我建议统一用 && 和 ||,避免优先级搞混。我曾经因为混用 and 和 && 调试了半小时,最后发现是优先级的问题。

3.5 字符串运算符:拼接的艺术

PHP里拼接字符串用点号(.),不是加号。很多从其他语言转过来的朋友容易搞混。

$firstName = "张";
$lastName = "三";
$fullName = $firstName . $lastName;  // "张三"

// 也可以用 .= 复合赋值
$greeting = "你好,";
$greeting .= $fullName;  // "你好,张三"
echo $greeting;

嗯,这里要注意——点号两边如果有数字,PHP会自动转成字符串。比如 "年龄:" . 25 结果是 "年龄:25",挺方便的。

3.6 错误控制运算符:@符号的妙用

这个运算符挺特别的——就是一个@符号。把它放在表达式前面,可以抑制错误信息输出。

// 假设文件不存在
$content = @file_get_contents("不存在的文件.txt");
if ($content === false) {
    echo "文件读取失败,但不会显示警告信息";
}
重要提醒:@符号只是隐藏错误,不是解决错误。我见过不少新手滥用@,结果程序出问题了完全不知道错在哪。我的建议是:开发阶段永远别用@,上线后也尽量少用。真要抑制错误,用try-catch更靠谱。

3.7 三元运算符:简洁的条件判断

三元运算符是if-else的简写形式。语法是:条件 ? 真值 : 假值

$age = 20;
$status = ($age >= 18) ? "成年" : "未成年";
echo $status;  // "成年"

// 也可以嵌套使用,但我不建议
$score = 85;
$grade = ($score >= 90) ? "优秀" : (($score >= 60) ? "及格" : "不及格");
echo $grade;  // "及格"

我个人习惯用三元运算符处理简单的二选一场景。一旦逻辑复杂了,还是老老实实写if-else吧——代码是给人读的,不是用来炫技的。

PHP 7.4+ 新特性:空合并运算符 ?? 可以看作是三元运算符的升级版。比如 $name = $_GET['name'] ?? '默认值',如果$_GET['name']存在且不为null,就用它,否则用默认值。比 isset($_GET['name']) ? $_GET['name'] : '默认值' 简洁多了。

好了,运算符这块就聊到这儿。说白了,运算符就是PHP的「动词」,让数据产生各种变化。多写多练,慢慢就熟练了。下一章咱们聊聊流程控制——if、switch、循环这些,到时候见。