首页 / PHP 入门教程 / PHP 运算符

PHP 入门教程

PHP 运算符

本教程共 65 篇 · 第 10 篇 · 更新于 2026-07-24 · 约 5 分钟阅读

PHPPHP8运算符算术运算逻辑运算位运算

10. PHP 运算符

本节目标:掌握 PHP 各类运算符的用法和优先级。学完你能写出正确的数学计算和逻辑判断表达式。

10.1 算术运算符

<?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(取反)
?>
Note

% 取模运算符的结果符号与被除数相同:-10 % 3 等于 -1

10.2 赋值运算符

<?php
$a = 10;        // 基础赋值

$a += 5;        // 等同于 $a = $a + 5;  现在 $a = 15
$a -= 3;        // 等同于 $a = $a - 3;  现在 $a = 12
$a *= 2;        // 现在 $a = 24
$a /= 4;        // 现在 $a = 6
$a %= 4;        // 现在 $a = 2
$a **= 3;       // 现在 $a = 8

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

10.3 自增自减运算符

<?php
$a = 5;

// 前递增:先加 1,再使用
$b = ++$a;      // $a = 6, $b = 6

// 后递增:先使用,再加 1
$a = 5;
$c = $a++;      // $c = 5, $a = 6

// 前递减和后递减同理
$x = 10;
echo --$x;      // 9(先减)
echo $x--;      // 9(后减,现在 $x 是 8)
?>
Tip

单独一行使用时,$a++++$a 效果相同。参与赋值或表达式时,要注意区别。

10.4 比较运算符

<?php
$a = 5;
$b = "5";
$c = 10;

echo $a == $b;    // true(松散等于)
echo $a === $b;   // false(严格等于)
echo $a != $c;    // true(不等于)
echo $a <> $c;    // true(不等于,同 !=)
echo $a !== $b;   // true(严格不等于)
echo $a > $c;     // false(大于)
echo $a < $c;     // true(小于)
echo $a >= 5;     // true(大于等于)
echo $a <= 4;     // false(小于等于)

// 太空船运算符(PHP 7+)
echo 5 <=> 10;    // -1(左边小)
echo 5 <=> 5;     // 0(相等)
echo 10 <=> 5;    // 1(左边大)
?>

10.5 逻辑运算符

<?php
$a = true;
$b = false;

// 与:两边都为 true 才返回 true
var_dump($a && $b);   // false
var_dump($a and $b);  // false(同 &&,但优先级更低)

// 或:至少一边为 true 就返回 true
var_dump($a || $b);   // true
var_dump($a or $b);   // true(同 ||,但优先级更低)

// 异或:两边有且仅有一个为 true
var_dump($a xor $b);  // true

// 非:取反
var_dump(!$a);        // false

// 短路求值示例
$x = 5;
$y = 0;
if ($y != 0 && $x / $y > 2) {
    // 不会执行,因为 $y != 0 为 false,后面不再计算
}
?>
Note

&& 优先级高于 and|| 优先级高于 or。建议统一使用 &&||,避免优先级混淆。

10.6 三元运算符

<?php
$score = 85;

// 基础三元运算
$result = ($score >= 60) ? "及格" : "不及格";
echo $result;  // 及格

// 嵌套三元(不建议嵌套太深)
$grade = ($score >= 90) ? "A" : (($score >= 80) ? "B" : "C");

// 简写形式(PHP 5.3+):省略中间部分
$name = "张三";
$display = $name ?: "匿名";  // 如果 $name 为真,返回 $name,否则返回 "匿名"
?>

10.7 空合并运算符 ??

<?php
// 如果变量存在且不为 null,返回它的值,否则返回默认值
$a = null;
$b = "hello";

echo $a ?? "default";  // default
echo $b ?? "default";  // hello

// 链式使用
$config = [];
echo $config['host'] ?? 'localhost';      // localhost
echo $config['port'] ?? 3306;             // 3306

// 等价写法对比
$value = isset($_GET['name']) ? $_GET['name'] : '匿名';  // 传统写法
$value = $_GET['name'] ?? '匿名';                        // ?? 写法(推荐)
?>
Tip

?? 是 PHP 7.0 引入的,能大幅简化”存在则取,否则给默认值”的场景。

10.8 空安全运算符 ?->(PHP 8.0+)

<?php
class User {
    public ?Profile $profile = null;
}

class Profile {
    public string $avatar = "default.png";
}

$user = new User();

// 传统写法需要层层判断
// $avatar = $user->profile ? $user->profile->avatar : null;

// PHP 8.0+ 空安全运算符
$avatar = $user->profile?->avatar;  // null,不会报错

$user->profile = new Profile();
$avatar = $user->profile?->avatar;  // default.png
?>

10.9 管道运算符 |>(PHP 8.5+)

PHP 8.5 引入了管道运算符,让链式操作更易读:

<?php
// 传统写法(嵌套调用)
$result = array_sum(array_map(fn($x) => $x * 2, array_filter([1, 2, 3, 4, 5], fn($x) => $x > 2)));

// PHP 8.5+ 管道写法
// 管道左侧的值作为第一个参数传入右侧的 callable
$result = [1, 2, 3, 4, 5]
    |> (fn($x) => array_filter($x, fn($y) => $y > 2))
    |> (fn($x) => array_map(fn($y) => $y * 2, $x))
    |> array_sum(...);
?>
Note

管道运算符 |> 在 PHP 8.5 中正式引入。它将左侧值作为第一个参数传递给右侧的 callable(必须接受单参数)。使用闭包或 ...(first-class callable)语法来适配多参数函数。PHP 8.4 及更早版本不支持此特性。

10.10 运算符优先级

<?php
// 不确定时,用括号明确优先级
$a = 5;
$b = 3;
$c = 2;

$d = $a + $b * $c;       // 11(先乘后加)
$e = ($a + $b) * $c;     // 16(括号优先)

// 常见优先级从高到低:
// () > ! > ** > * / % > + - . > < <= > >= > == != === !== > && > || > ?? > =

// 赋值优先级很低
$x = true || false && false;  // true(先算 &&,再 ||,最后 =)
// 等价于:$x = (true || (false && false))
?>
Tip

别死记优先级。遇到复杂表达式,加括号就完了。代码是给人看的,不是给编译器炫技的。


来源:参考了 w3cschool「PHP 运算符」、runoob「PHP 运算符」以及 php.net 官方文档,综合改写后所得。