运算符优先级 #

一、优先级概念 #

运算符优先级决定了表达式中运算的顺序。优先级高的运算符先执行。

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