ZetCode

PHP 表达式

上次修改时间:2025 年 5 月 18 日

在本文中,我们将探讨 PHP 中的表达式,这是一个驱动数据操作、决策制定和程序执行的基本概念。

PHP 中的表达式是任何由值、变量、运算符和函数调用组合而成的,最终计算得到单个结果。这些表达式在 PHP 编程中起着至关重要的作用,它们是赋值、条件语句、循环、函数调用和数学计算的基础。每个 PHP 脚本都由表达式组成,这些表达式决定了数据的处理、存储和动态执行方式。

PHP 表达式可以根据其功能分为不同的类型。

表达式是根据运算符的 *优先级* 进行评估的,它决定了操作的执行顺序。PHP 遵循标准的数学优先级规则,确保表达式产生一致的结果。

如果运算符的优先级不明确,可以使用括号来分组操作并阐明评估顺序。这在组合不同类型的表达式或在单个表达式中使用多个运算符时特别有用。

*结合性* 是表达式中的另一个重要概念。它定义了相同优先级的运算符的评估方向。例如,赋值运算符(=)是右结合的,这意味着当多个赋值链在一起时,赋值是从右到左进行的。例如,在表达式 $a = $b = 5; 中,值 5 首先被赋值给 $b,然后 $b 被赋值给 $a

算术表达式

算术表达式使用 +、-、*、/ 和 % 等运算符执行数学计算。它们处理数值,并遵循标准的数学优先级规则。

arithmetic.php
<?php

declare(strict_types=1);

$a = 10;
$b = 3;

// Basic operations
echo "Addition: " . ($a + $b) . "\n";
echo "Subtraction: " . ($a - $b) . "\n";
echo "Multiplication: " . ($a * $b) . "\n";
echo "Division: " . ($a / $b) . "\n";
echo "Modulus: " . ($a % $b) . "\n";
echo "Exponentiation: " . ($a ** $b) . "\n";

// Compound assignments
$a += 5;  // $a = $a + 5
echo "After += 5: $a\n";

// Operator precedence
$result = 2 + 3 * 4;  // Multiplication first
echo "Precedence example: $result\n";

这演示了 PHP 中的基本算术运算。注意运算符优先级如何影响评估顺序 - 乘法在加法之前执行,除非使用了括号。

λ php arithmetic.php
Addition: 13
Subtraction: 7
Multiplication: 30
Division: 3.3333333333333
Modulus: 1
Exponentiation: 1000
After += 5: 15
Precedence example: 14

字符串表达式

字符串表达式操作文本数据。连接运算符 (.) 将字符串连接在一起。PHP 也支持双引号字符串中的字符串插值。

strings.php
<?php

declare(strict_types=1);

$firstName = "John";
$lastName = "Doe";

// Concatenation
$fullName = $firstName . " " . $lastName;
echo "Full name: $fullName\n";

// String interpolation
$age = 30;
echo "Name: $fullName, Age: $age\n";

// String functions in expressions
$message = "Hello, " . strtoupper($firstName) . "!";
echo "$message\n";

// Heredoc string
$html = <<<HTML
<div>
  <h1>$fullName</h1>
  <p>Age: $age</p>
</div>
HTML;
echo $html;

这显示了各种字符串操作。注意变量如何插入到双引号字符串和 heredoc 语法中,而需要连接才能得到更复杂的表达式。

λ php strings.php
Full name: John Doe
Name: John Doe, Age: 30
Hello, JOHN!
<div>
  <h1>John Doe</h1>
  <p>Age: 30</p>
</div>

比较表达式

比较表达式评估值之间的关系并返回布尔结果。PHP 既有宽松 (==) 也有严格 (===) 的比较运算符。

comparison.php
<?php

declare(strict_types=1);

$a = 5;
$b = "5";

// Loose comparison (value only)
echo "5 == '5': " . ($a == $b ? 'true' : 'false') . "\n";

// Strict comparison (value and type)
echo "5 === '5': " . ($a === $b ? 'true' : 'false') . "\n";

// Other comparisons
echo "5 != '5': " . ($a != $b ? 'true' : 'false') . "\n";
echo "5 !== '5': " . ($a !== $b ? 'true' : 'false') . "\n";
echo "5 > 3: " . ($a > 3 ? 'true' : 'false') . "\n";

// Spaceship operator (PHP 7+)
echo "5 <=> 3: " . ($a <=> 3) . "\n";  // 1
echo "5 <=> 5: " . ($a <=> 5) . "\n";  // 0
echo "5 <=> 7: " . ($a <=> 7) . "\n";  // -1

这演示了不同的比较运算符。spaceship 运算符返回 -1、0 或 1,具体取决于左操作数是小于、等于还是大于右操作数。

λ php comparison.php
5 == '5': true
5 === '5': false
5 != '5': false
5 !== '5': true
5 > 3: true
5 <=> 3: 1
5 <=> 5: 0
5 <=> 7: -1

逻辑表达式

逻辑表达式使用 && (and)、|| (or) 和 ! (not) 等运算符组合布尔值。它们通常用于条件语句中。

logical.php
<?php

declare(strict_types=1);

$isLoggedIn = true;
$isAdmin = false;
$hasPermission = true;

// AND operation
if ($isLoggedIn && $hasPermission) {
    echo "Access granted\n";
}

// OR operation
if ($isAdmin || $hasPermission) {
    echo "Admin or privileged access\n";
}

// NOT operation
if (!$isAdmin) {
    echo "Not an admin\n";
}

// Short-circuit evaluation
function checkSomething() {
    echo "Checking...\n";
    return true;
}

// Only first condition evaluated if false
if (false && checkSomething()) {
    echo "This won't execute\n";
}

// Only first condition evaluated if true
if (true || checkSomething()) {
    echo "This executes without calling checkSomething()\n";
}

这显示了逻辑运算和短路评估。PHP 在确定最终结果后立即停止评估逻辑表达式,这可以防止不必要的函数调用。

λ php logical.php
Access granted
Admin or privileged access
Not an admin
This executes without calling checkSomething()

三元运算符

三元运算符 (?:) 为简单的 if-else 语句提供了一种速记方式。它评估一个条件并返回两个值中的一个。

ternary.php
<?php

declare(strict_types=1);

$age = 20;

// Basic ternary
$status = ($age >= 18) ? "Adult" : "Minor";
echo "Status: $status\n";

// Nested ternary
$score = 75;
$grade = ($score >= 90) ? "A" : 
         (($score >= 80) ? "B" : 
         (($score >= 70) ? "C" : "F"));
echo "Grade: $grade\n";

// Null coalescing operator (PHP 7+)
$username = $_GET['user'] ?? 'guest';
echo "Username: $username\n";

// Null coalescing assignment (PHP 7.4+)
$options = [];
$options['timeout'] ??= 30;
echo "Timeout: {$options['timeout']}\n";

这演示了三元运算符和空值合并运算符。空值合并运算符 (??) 在处理潜在的未定义变量或数组键时特别有用,用于提供默认值。

λ php ternary.php
Status: Adult
Grade: C
Username: guest
Timeout: 30

运算符优先级

运算符优先级决定了复杂表达式中操作的评估顺序。括号可用于显式指定评估顺序。

运算符 描述 结合性
克隆 新建克隆,新建对象n/a
**求幂
~ - (int) (float) (string) (array) (object) (bool) @位取反,取负,类型转换,错误控制
instanceof类型检查
! 逻辑非
* / %乘法,除法,求模
+ - .加法,减法,连接
<< >>位移
< <= > >=比较非结合
== != === !== <> <=>相等,恒等,比较非结合
&按位与
^按位异或
|按位或
&&逻辑与
||逻辑或
??空值合并
? :三元
= += -= *= /= .= %= &= |= ^= <<= >>= **= ??=赋值
and逻辑与(较低优先级)
xor逻辑异或
or逻辑或(较低优先级)

上表总结了 PHP 中的运算符优先级。具有较高优先级的运算符首先被评估。例如,在表达式 2 + 3 * 4 中,乘法运算符 (*) 的优先级高于加法 (+),因此首先执行乘法,结果为 14。如果你想强制使用不同的评估顺序,可以使用括号。

precedence.php
<?php

declare(strict_types=1);

// Default precedence
$result = 2 + 3 * 4;
echo "Default: $result\n";

// Forced precedence with parentheses
$result = (2 + 3) * 4;
echo "Forced: $result\n";

// Logical operator precedence
$a = false;
$b = true;
$result = $a && $b || true;  // && has higher precedence than ||
echo "Logical result: " . ($result ? 'true' : 'false') . "\n";

// Assignment is right-associative
$x = $y = 10;
echo "x: $x, y: $y\n";

// Combining operators
$value = 5 * 3 + 2 ** 3;
echo "Combined: $value\n";

这显示了运算符优先级如何影响表达式评估。了解优先级对于编写正确的表达式(无需过多的括号)很重要。

λ php precedence.php
Default: 14
Forced: 20
Logical result: true
x: 10, y: 10
Combined: 23

运算符结合性

运算符 *结合性* 决定了在表达式中评估相同优先级的运算符的方向。在 PHP 中,大多数二元运算符都是左结合的,这意味着评估从左向右进行。一些运算符,例如赋值 (=)、三元 (?:) 和求幂 (**),是右结合的,因此评估从右向左进行。

当链接相同优先级的运算符时,结合性很重要。例如,赋值运算符是右结合的,所以在 $a = $b = 5; 中,首先将 5 赋值给 $b,然后将 $b 的值赋值给 $a

请参阅上面的运算符优先级表,了解每个运算符的结合性。如有疑问,请使用括号使评估顺序明确。

在本教程中,我们介绍了 PHP 中各种类型的表达式,包括算术、字符串、比较、逻辑和三元运算符。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我撰写了超过 1,400 篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出 所有 PHP 教程