PHP: 运算符

运算符是编程语言的"语法积木"——你用它们来组合变量和值,执行计算,做出判断。PHP 的运算符丰富且直观,很多直接借用了数学符号。

1. 算术运算符

▶ 示例:算术运算符全展示

PHP
<?php
$a = 10;
$b = 3;

echo $a + $b;   // 13  加法
echo $a - $b;   // 7   减法
echo $a * $b;   // 30  乘法
echo $a / $b;   // 3.333...  除法(注意:PHP除法总是返回浮点数)
echo $a % $b;   // 1   取模(取余数)
echo $a ** $b;  // 1000  幂运算(PHP 5.6+,10的3次方)

// 负数
echo -$a;       // -10  取反
?>
▶ 试一试

2. 赋值运算符

基本的 = 赋值就不说了。重点是组合赋值——写起来更简洁:

PHP
<?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 .= "元"; // $x = $x . "元"; → "2元"(字符串拼接赋值)

// 特别注意:PHP小写 .=  是大写 .= 用于字符串拼接
// 要区分 . 和 .=
?>

3. 比较运算符

用来比较两个值,结果是 truefalse

PHP
<?php
$a = 5;
$b = "5";

// 宽松比较(== 只比值,自动转换类型)
var_dump($a == $b);    // bool(true)  - 5 等于 "5"
var_dump($a != $b);    // bool(false)

// 严格比较(=== 比值又比类型)
var_dump($a === $b);   // bool(false) - 5 不等于 "5"(类型不同)
var_dump($a !== $b);   // bool(true)

// 大小比较
var_dump($a > 3);      // bool(true)
var_dump($a >= 5);     // bool(true)
var_dump($a < 10);     // bool(true)
var_dump($a <= 5);     // bool(true)

// 太空船运算符(PHP 7+) <=>
// 左边小返回-1,相等返回0,左边大返回1
echo 1 <=> 2;   // -1
echo 2 <=> 2;   // 0
echo 3 <=> 2;   // 1
// 常用于排序回调中
?>

(1) == vs === 决策表

场景 用哪个 原因
表单输入验证 === 用户输入 "0" 可能被 == 误判
比较数据库返回值 === 数据库可能返回字符串类型的数字
与常量比较 === 精确判断
检查 strpos() 返回值 !== false 0 会被 == false 误判
简单数字比较(确定两边都是数字) == 可以用,但 === 也没坏处
💡 提示: 除非有明确理由用 ==(宽松比较),否则默认用 ===(严格比较)。这能避免大量隐式类型转换带来的 bug。

▶ 示例:严格比较实战

PHP
<?php
// 搜索引擎中,用户可能输入 "0"
$search = "0";

// ❌ 错误写法
if ($search == false) {
    echo "您没有输入搜索词"; // 会执行!因为 "0" == false
}

// ✅ 正确写法
if ($search === "") {
    echo "您没有输入搜索词"; // "0" !== "",不会误判
}
?>
▶ 试一试

4. 逻辑运算符

用于组合多个判断条件:

PHP
<?php
$age = 20;
$hasTicket = true;

// 与 AND(两者都为 true 才为 true)
var_dump($age >= 18 && $hasTicket);   // bool(true)
var_dump($age >= 18 and $hasTicket);  // bool(true) — 优先级低于 &&

// 或 OR(其中一个为 true 就是 true)
var_dump($age < 18 || $hasTicket);    // bool(true) — 有票就能进
var_dump($age < 18 or $hasTicket);    // bool(true) — 优先级低于 ||

// 非 NOT(取反)
var_dump(!$hasTicket);  // bool(false)
var_dump(!false);       // bool(true)

// 异或 XOR(两个不同为true)
var_dump(true xor false);  // bool(true)
var_dump(true xor true);   // bool(false)
?>
⚠️ 注意: &&and 表现不同!$a = true && false; 结果是 false&& 优先级高于 =),而 $a = true and false; 结果是 true= 优先级高于 and)。永远用 && || 而不是 and or


5. 字符串运算符

PHP 的字符串运算符只有两个:

运算符 作用 示例 结果
. 拼接 "Hello" . " PHP" "Hello PHP"
.= 追加拼接 $s = "A"; $s .= "B"; $s = "AB"
PHP
<?php
$name = "小明";
echo "你好," . $name . "!";  // 你好,小明!

$html = "<div>";
$html .= "<h1>标题</h1>";
$html .= "<p>内容</p>";
$html .= "</div>";
echo $html;
// <div><h1>标题</h1><p>内容</p></div>
?>

6. 三元运算符(?:

三元运算符是 if...else 的简写:

▶ 示例:三元与null合并运算符对比

PHP
<?php
$age = 20;

// 格式:条件 ? 值1 : 值2
$status = ($age >= 18) ? "成年人" : "未成年人";
echo $status;  // 成年人

// 上面的代码等价于:
if ($age >= 18) {
    $status = "成年人";
} else {
    $status = "未成年人";
}

// PHP 5.3+ 简写版(省略中间部分)
$username = $_GET['name'] ?: "游客";
// 等上面括:$_GET['name'] 如果有值就用,没有就用 "游客"
?>
▶ 试一试
💡 提示: 三元运算符适合 1 行判断。但不要嵌套三元——$a ? $b ? $c : $d : $e 完全不可读。


7. Null 合并运算符(??

这是 PHP 7 引入的最实用特性之一:

PHP
<?php
// ?? 运算符:左边不是 null 就用左边,是 null 就用右边
$username = $_GET['user'] ?? "匿名用户";
// 等价于:isset($_GET['user']) ? $_GET['user'] : "匿名用户"

// ??= 运算符(PHP 7.4+):左边是 null 才赋值
$config = null;
$config ??= "默认值";   // $config 现在是 "默认值"

$config2 = "已有值";
$config2 ??= "默认值";  // $config2 还是 "已有值"(不是null不覆盖)

// ?? 和 ?: 的区别:
$name = "";
echo $name ?: "默认";   // "默认"(空字符串被当作false)
echo $name ?? "默认";   // ""(空字符串不是null)
?>
运算符 判断逻辑 "" 的处理
?: 左边为「假」就用右边 "" → 用右边
?? 左边为「null」或「未定义」就用右边 "" → 用左边(""不是null)
💡 提示: 处理用户输入时大多数情况用 ???: 更安全,因为用户可能输入空字符串 "",而空字符串是有效输入。


8. 运算符优先级

当一个表达式里有多个运算符时,PHP 按优先级来决定先算哪个:

优先级 运算符
**(幂)
!~++--
*/%
+-.
<<=>>=
==!====!==
&&
`
??
?:(三元)
=+=.= 等赋值
PHP
<?php
// 不用记优先级——用括号明确意图
$result = $a + $b * $c;        // 不清晰
$result = $a + ($b * $c);      // 清晰

// 复杂条件同样用括号
if (($age >= 18 && $hasTicket) || $isVip) {
    echo "允许入场";
}
?>
💡 提示: 运算符优先级表不用背。当你不确定时,加括号。 代码是写给人看的,括号让你的意图一目了然。

❓ 常见问题

Q ===== 到底什么时候用哪个?
A 默认用 ===。只有在你确实需要类型自动转换(比如比较来自不同来源的数字)时才用 ==strpos() 判断、与 false/null 比较时,必须用 ===
Q ???: 怎么选?
A 从 GET/POST 获取用户输入时用 ??(因为用户可能不传这个参数)。判断变量"有无实际内容"时用 ?:(空字符串也算无内容)。Array 键存在性判断也用 ??
Q 为什么 1 + "10只猫" 结果是 11,不是 1?
A PHP 把字符串转数字时,从开头取直到第一个非数字字符。"10只猫" 开头是 "10",所以转成 10。如果开头就是非数字("猫10只"),则转成 0。

📖 小节

📝 作业

  1. 创建两个变量代表用户输入的年龄和是否会员,用逻辑运算符判断是否允许入场(≥18岁或会员)。
  2. ?? 运算符安全获取 URL 参数 page,默认值为 1;再用三元运算符判断:如果 page <= 1 显示"首页",否则显示"第 N 页"。
  3. 写一个运算符综合练习:给定商品价格和折扣率,计算折后价并格式化输出(保留两位小数)。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏