第三章:PHP运算符与表达式
运算符这东西,说白了就是让数据动起来的工具。我刚开始学PHP那会儿,总觉得运算符就是加减乘除,没啥好学的。后来踩了几个坑才发现——嗯,这里面的门道还真不少。
3.1 算术运算符
算术运算符就是咱们小学就学的那套:加、减、乘、除、取余。但在PHP里,有些细节你得注意。
<?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
?>
注意:除法运算的结果可能是浮点数。我曾经在项目中因为没注意这个,导致数据库存了奇怪的值,排查了半天才发现是精度问题。
还有个取模运算(%),很多人以为就是求余数。没错,但要注意——如果被除数是负数,结果也会是负数。比如 -10 % 3 的结果是 -1,而不是 2。
3.2 赋值运算符
最基本的赋值就是 =,但PHP还提供了一堆组合赋值运算符,写起来特别爽。
<?php
$x = 10;
$x += 5; // 等价于 $x = $x + 5
$x -= 3; // 等价于 $x = $x - 3
$x *= 2; // 等价于 $x = $x * 2
$x /= 4; // 等价于 $x = $x / 4
$x %= 3; // 等价于 $x = $x % 3
$x .= 'hello'; // 字符串拼接赋值
?>
我个人习惯在循环里用 += 和 .=,代码看起来干净很多。你想想看,要是每次都写 $x = $x + 1,多啰嗦啊。
3.3 比较运算符
比较运算符是写条件判断的基础。PHP里有个特别容易让人翻车的地方——宽松比较 vs 严格比较。
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
| == | 等于(宽松) | 1 == '1' | true |
| === | 全等于(严格) | 1 === '1' | false |
| != | 不等于(宽松) | 1 != '1' | false |
| !== | 不全等于(严格) | 1 !== '1' | true |
| < | 小于 | 2 < 3 | true |
| > | 大于 | 2 > 3 | false |
| <= | 小于等于 | 2 <= 2 | true |
| >= | 大于等于 | 2 >= 3 | false |
核心建议:我建议你养成用 === 和 !== 的习惯。宽松比较虽然方便,但容易出一些莫名其妙的bug。我曾经在用户登录验证里用了 ==,结果密码 '0e12345' 和 '0e67890' 居然被认为是相等的——因为PHP把它们当科学计数法处理了!
3.4 逻辑运算符
逻辑运算符用来组合多个条件。常用的有 &&(与)、||(或)、!(非)。
<?php
$age = 25;
$hasID = true;
// 两个条件都满足
if ($age >= 18 && $hasID) {
echo '可以进入';
}
// 至少一个条件满足
if ($age >= 18 || $hasID) {
echo '有戏';
}
// 取反
if (!$hasID) {
echo '没带证件';
}
?>
这里有个小技巧——短路求值。用 && 时,如果第一个条件为 false,第二个条件根本不会执行。用 || 时,如果第一个条件为 true,第二个也不会执行。我经常利用这个特性来简化代码:
<?php
// 只有用户登录了才执行后面的操作
$user && doSomething($user);
?>
3.5 三元运算符
三元运算符是简化 if-else 的利器。语法是:条件 ? 真值 : 假值。
<?php
$age = 20;
$status = $age >= 18 ? '成年' : '未成年';
echo $status; // 输出:成年
?>
我个人觉得三元运算符特别适合做简单的条件赋值。但别嵌套太多层——我曾经见过有人写了三层嵌套的三元运算符,那代码读起来简直像天书。记住:简洁不等于晦涩。
小技巧:PHP 5.3 之后支持了简写形式 ?:,意思是「如果左边为真就用左边,否则用右边」。
<?php
$name = $_GET['name'] ?: '匿名用户';
// 等价于 $name = $_GET['name'] ? $_GET['name'] : '匿名用户';
?>
3.6 运算符优先级
运算符优先级决定了表达式里谁先算谁后算。这玩意儿看着枯燥,但写代码时经常遇到。
| 优先级 | 运算符 | 结合方向 |
|---|---|---|
| 1(最高) | () | 左 |
| 2 | ! ++ -- | 右 |
| 3 | * / % | 左 |
| 4 | + - . | 左 |
| 5 | < > <= >= | 左 |
| 6 | == != === !== | 左 |
| 7 | && | 左 |
| 8 | || | 左 |
| 9 | ?: | 左 |
| 10(最低) | = += -= 等 | 右 |
你可能会问:「这么多优先级,我哪记得住啊?」我的建议是——拿不准就用括号。括号不仅能让优先级明确,还能让代码更易读。
<?php
// 这样写,鬼知道先算哪个
$result = $a + $b * $c > $d && $e || $f;
// 加上括号,一目了然
$result = (($a + ($b * $c)) > $d) && ($e || $f);
?>
避坑指南:我曾经在写权限判断时,忘了 && 优先级高于 ||,结果写出来的逻辑完全不对。调试了半小时才发现是优先级的问题。从那以后,只要涉及多个逻辑运算符,我必加括号。
3.7 实战小例子
把今天学的运算符串起来,写个简单的用户验证:
<?php
$username = 'admin';
$password = '123456';
$isActive = true;
$loginAttempts = 3;
// 检查登录条件
$canLogin = ($username === 'admin' && $password === '123456')
&& $isActive
&& $loginAttempts > 0;
$message = $canLogin ? '登录成功' : '登录失败';
echo $message;
?>
这个例子用到了严格比较、逻辑运算符、三元运算符,还用了括号来明确优先级。你看,运算符这东西,用好了能让代码既简洁又安全。
好了,运算符这块就聊到这儿。下一章咱们聊聊流程控制——if、else、switch这些,到时候你会发现,今天学的比较运算符和逻辑运算符全都能用上。