运算符优先级 #
一、优先级概念 #
运算符优先级决定了表达式中运算的顺序。优先级高的运算符先执行。
php
<?php
$result = 2 + 3 * 4;
echo $result;
$result = (2 + 3) * 4;
echo $result;
二、优先级表 #
从高到低排列:
| 优先级 | 运算符 | 说明 | 结合性 |
|---|---|---|---|
| 1 | clone, new | 创建对象 | 无 |
| 2 | ** | 幂运算 | 右 |
| 3 | +, -, ~, ++, --, (int), (float), (string), (array), (object), (bool) | 一元运算符 | 右 |
| 4 | instanceof | 类型检查 | 无 |
| 5 | ! | 逻辑非 | 右 |
| 6 | *, /, % | 乘除取模 | 左 |
| 7 | +, -, . | 加减连接 | 左 |
| 8 | <<, >> | 位移动 | 左 |
| 9 | <, <=, >, >= | 大小比较 | 无 |
| 10 | ==, !=, ===, !==, <>, <=> | 相等比较 | 无 |
| 11 | & | 按位与 | 左 |
| 12 | ^ | 按位异或 | 左 |
| 13 | | | 按位或 | 左 |
| 14 | && | 逻辑与 | 左 |
| 15 | || | 逻辑或 | 左 |
| 16 | ?? | null合并 | 右 |
| 17 | ? : | 三元运算符 | 左 |
| 18 | =, +=, -=, *=, /=, %=, **=, .=, ??= | 赋值 | 右 |
| 19 | yield, yield from | 生成器 | 右 |
| 20 | and | 逻辑与 | 左 |
| 21 | xor | 逻辑异或 | 左 |
| 22 | or | 逻辑或 | 左 |
三、结合性 #
3.1 左结合 #
从左到右计算:
php
<?php
$a = 10 - 5 - 2;
echo $a;
$a = 100 / 10 / 2;
echo $a;
3.2 右结合 #
从右到左计算:
php
<?php
$a = 2 ** 3 ** 2;
echo $a;
$b = $c = $d = 10;
echo $b, $c, $d;
3.3 无结合性 #
相同优先级的运算符不能相邻使用:
php
<?php
$a = 1 < 2 > 0;
四、常见陷阱 #
4.1 混合运算 #
php
<?php
$result = true && false || true;
var_dump($result);
$result = true and false or true;
var_dump($result);
4.2 赋值与比较 #
php
<?php
$a = 5;
if ($a = 10) {
echo "总是执行";
}
if ($a == 10) {
echo "条件判断";
}
4.3 三元运算符 #
php
<?php
$a = 1;
$b = 2;
$c = 3;
$d = 4;
$result = $a ? $b : $c ? $d : 0;
var_dump($result);
$result = ($a ? $b : $c) ? $d : 0;
var_dump($result);
$result = $a ? $b : ($c ? $d : 0);
var_dump($result);
4.4 字符串连接与算术 #
php
<?php
echo "Result: " . 1 + 2;
echo "Result: " . (1 + 2);
4.5 比较与逻辑 #
php
<?php
$a = 5;
$b = 10;
$c = 15;
$result = $a < $b && $b < $c;
var_dump($result);
$result = $a < $b < $c;
五、使用括号 #
5.1 明确优先级 #
php
<?php
$result = (2 + 3) * (4 - 1);
echo $result;
$isValid = ($age >= 18) && ($status === 'active');
5.2 提高可读性 #
php
<?php
if (($user->isActive() && $user->hasPermission('edit')) || $user->isAdmin()) {
}
if ($user->isActive() && ($user->hasPermission('edit') || $user->isAdmin())) {
}
5.3 复杂表达式 #
php
<?php
$result = (($a + $b) * ($c - $d)) / ($e + $f);
六、实际示例 #
6.1 条件判断 #
php
<?php
$age = 25;
$hasLicense = true;
$hasInsurance = true;
if ($age >= 18 && $hasLicense && $hasInsurance) {
echo "可以驾驶";
}
if (($age >= 18 && $hasLicense) || $age >= 21) {
echo "满足条件";
}
6.2 数学运算 #
php
<?php
$a = 10;
$b = 5;
$c = 2;
$result = $a + $b * $c;
echo $result;
$result = ($a + $b) * $c;
echo $result;
$result = $a ** $b ** $c;
echo $result;
$result = ($a ** $b) ** $c;
echo $result;
6.3 字符串处理 #
php
<?php
$name = "John";
$age = 25;
$message = "Name: " . $name . ", Age: " . $age;
echo $message;
$message = "Name: $name, Age: $age";
echo $message;
6.4 数组操作 #
php
<?php
$a = ['a' => 1];
$b = ['b' => 2];
$c = ['c' => 3];
$result = $a + $b + $c;
print_r($result);
七、最佳实践 #
7.1 使用括号明确意图 #
php
<?php
if (($a && $b) || ($c && $d)) {
}
7.2 避免复杂表达式 #
php
<?php
$condition1 = $a && $b;
$condition2 = $c && $d;
if ($condition1 || $condition2) {
}
7.3 分解复杂逻辑 #
php
<?php
function canAccess(User $user, Resource $resource): bool
{
$isOwner = $user->id === $resource->owner_id;
$hasPermission = $user->hasPermission('read');
$isAdmin = $user->role === 'admin';
return $isOwner || $hasPermission || $isAdmin;
}
7.4 避免混淆的写法 #
php
<?php
$result = $a && $b || $c && $d;
$result = ($a && $b) || ($c && $d);
八、PHP 8 变化 #
8.1 字符串与数字比较 #
PHP 8 中,字符串与数字比较时使用数字比较:
php
<?php
var_dump("10" > "9");
var_dump("10" > 9);
8.2 算术运算 #
PHP 8 中,算术运算符对非数字字符串更严格:
php
<?php
echo "10" + "20";
echo "10abc" + "20";
九、总结 #
本章学习了:
- 运算符优先级表
- 结合性概念
- 常见陷阱
- 使用括号明确优先级
- 最佳实践
下一章将学习PHP控制流。
最后更新:2026-03-26