第三章: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这些,到时候你会发现,今天学的比较运算符和逻辑运算符全都能用上。