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; // 10echo $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`。复杂表达式中多用括号明确意图,比记优先级更实用。