PHP 运算符

运算符是用于对变量和值执行操作的符号。PHP 提供了丰富的运算符,涵盖算术计算、值比较、逻辑判断、字符串拼接等各种场景。熟练掌握运算符是编写高效 PHP 代码的基础。

理解运算符的优先级同样重要。当一个表达式中包含多个运算符时,PHP 会按照预定义的优先级顺序执行。括号 () 可以改变运算顺序,在复杂表达式中建议多用括号明确意图。

算术运算符

算术运算符用于执行基本的数学运算:

PHP 实例
$a = 10;
$b = 3;

echo $a + $b; // 13 加法 echo $a - $b; // 7 减法 echo $a * $b; // 30 乘法 echo $a / $b; // 3.333... 除法(结果为浮点数) echo $a % $b; // 1 取余(模运算) echo $a ** $b; // 1000 幂运算(PHP 5.6+) echo -$a; // -10 取反 ``

取余运算符 % 在实际开发中很有用,常用于判断奇偶数、循环分组等场景:

`php // 判断奇偶 echo ($num % 2 === 0) ? '偶数' : '奇数';

// 每3个一组 for ($i = 1; $i <= 9; $i++) { echo $i; if ($i % 3 === 0) echo "\n"; // 每3个换行 } `

赋值运算符

赋值运算符用于给变量赋值,复合赋值运算符是简写形式:

`php $x = 10; $x += 5; // 等同于 $x = $x + 5 → 15 $x -= 3; // 等同于 $x = $x - 3 → 12 $x = 2; // 等同于 $x = $x 2 → 24 $x /= 4; // 等同于 $x = $x / 4 → 6 $x %= 4; // 等同于 $x = $x % 4 → 2 $x = 3; // 等同于 $x = $x 3 → 8

// 字符串拼接赋值 $str = "Hello"; $str .= " World"; // "Hello World"

// Null 合并赋值(PHP 7.4+) $config['debug'] ??= false; // 如果不存在则赋值 `

比较运算符

比较运算符用于比较两个值,返回布尔值。PHP 中最容易出错的就是 ===== 的混淆:

运算符名称说明
==等于值相等(会进行类型转换)
===全等值和类型都相等
!=<>不等于值不相等
!==不全等值或类型不相等
>大于左边大于右边
<小于左边小于右边
>=大于等于左边大于或等于右边
<=小于等于左边小于或等于右边
<=>太空船运算符小于返回-1,等于返回0,大于返回1

== 与 === 的重要区别

这是 PHP 初学者最容易踩的坑,务必理解:

`php // == 会进行类型转换再比较 var_dump(0 == "foo"); // PHP 8 中为 false(PHP 7 中为 true!) var_dump(0 == ""); // PHP 8 中为 false var_dump(1 == "1"); // true var_dump(1 == true); // true var_dump(0 == false); // true var_dump(null == false); // true

// === 不进行类型转换,值和类型都必须相同 var_dump(1 === "1"); // false(类型不同) var_dump(1 === 1); // true var_dump(null === false); // false `

最佳实践:在条件判断中,尽量使用 === 而非 ==,避免类型转换带来的意外结果。

太空船运算符

太空船运算符 <=> 在 PHP 7 中引入,常用于排序回调函数:

`php echo 1 <=> 2; // -1(左边小) echo 2 <=> 2; // 0(相等) echo 3 <=> 2; // 1(左边大)

// 用于 usort 排序 $users = [ ['name' => '张三', 'age' => 25], ['name' => '李四', 'age' => 20], ['name' => '王五', 'age' => 30], ]; usort($users, fn($a, $b) => $a['age'] <=> $b['age']); // 按年龄升序排列 `

逻辑运算符

逻辑运算符用于组合多个条件:

`php $a = true; $b = false;

var_dump($a && $b); // false 逻辑与(两者都为 true 才为 true) var_dump($a || $b); // true 逻辑或(至少一个为 true 即为 true) var_dump(!$a); // false 逻辑非(取反) var_dump($a xor $b); // true 异或(两者不同时为 true) `

&&and||or 功能相同,但优先级不同

`php // && 优先级高于 = $result = true && false; // $result = false

// and 优先级低于 = $result = true and false; // $result = true(先赋值,再 and)

// 建议始终使用 && 和 ||,避免优先级混淆 `

短路求值

PHP 的逻辑运算符支持短路求值,这是一个重要的性能优化特性:

`php // && 短路:左边为 false,右边不执行 false && expensiveFunction(); // expensiveFunction() 不会被调用

// || 短路:左边为 true,右边不执行 true || expensiveFunction(); // expensiveFunction() 不会被调用

// 实际应用:安全地访问可能为 null 的对象 $user && $user->sendEmail(); // $user 为 null 时不会调用 sendEmail() `

三元运算符与 Null 合并

`php $age = 20;

// 三元运算符:条件 ? 真值 : 假值 $status = ($age >= 18) ? "成年" : "未成年"; echo $status; // 成年

// 简写三元(Elvis 运算符):值存在且非假则用它,否则用默认值 $name = $username ?: '访客'; // 等同于 $username ? $username : '访客'

// Null 合并运算符(PHP 7+):值存在且非 null 则用它 $name = $_GET['name'] ?? '访客';

// 链式 Null 合并 $value = $a ?? $b ?? $c ?? '默认值';

// Null 合并赋值(PHP 7.4+) $_SESSION['views'] ??= 0; $_SESSION['views']++; `

递增 / 递减运算符

`php $i = 5; echo $i++; // 5(后置:先返回值,再加1) echo $i; // 6 echo ++$i; // 7(前置:先加1,再返回值) echo $i--; // 7(后置:先返回值,再减1) echo $i; // 6 echo --$i; // 5(前置:先减1,再返回值) `

位运算符

位运算符直接操作整数的二进制位,在权限系统、标志位等场景中很有用:

`php $a = 0b1100; // 12 $b = 0b1010; // 10

echo $a & $b; // 8 (0b1000) 按位与 echo $a | $b; // 14 (0b1110) 按位或 echo $a ^ $b; // 6 (0b0110) 按位异或 echo ~$a; // -13 按位非 echo $a << 1; // 24 左移 echo $a >> 1; // 6 右移

// 实际应用:权限系统 const PERM_READ = 0b001; // 1 const PERM_WRITE = 0b010; // 2 const PERM_DELETE = 0b100; // 4

$userPerm = PERM_READ | PERM_WRITE; // 3(有读写权限)

// 检查是否有某权限 if ($userPerm & PERM_READ) echo "有读权限"; if ($userPerm & PERM_DELETE) echo "有删除权限"; // 不输出

常见问题

Q:===== 在实际开发中该用哪个? A:建议默认使用 ===(全等),只有在明确需要类型转换比较时才用 ==。使用 === 可以避免很多隐蔽的 bug,代码意图也更清晰。

Q:&&and 有什么区别? A:功能相同,但优先级不同。&& 优先级高于赋值运算符 =,而 and 优先级低于 =。这会导致 $result = true and false$result 的值是 true 而非 false。建议统一使用 &&||

Q:???: 有什么区别? A:??(Null 合并)检查值是否为 null 或不存在,?:(Elvis)检查值是否为假值(false、0、空字符串等)。$_GET['key'] ?? 'default' 在 key 不存在时不会产生警告,而 $_GET['key'] ?: 'default' 在 key 不存在时会产生 Notice。

Q:PHP 运算符优先级怎么记? A:不需要死记,记住几个关键点:括号最高;算术 > 比较 > 逻辑;&& > || > and > or`。复杂表达式中多用括号明确意图,比记优先级更实用。