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. 比较运算符
用来比较两个值,结果是 true 或 false:
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/0/1,适合排序&&优先级高于and,只用&&||??判断 null/未定义,?:判断真假,处理用户输入优先??- 不确定优先级时加括号,代码清晰比简洁重要
📝 作业
- 创建两个变量代表用户输入的年龄和是否会员,用逻辑运算符判断是否允许入场(≥18岁或会员)。
- 用
??运算符安全获取 URL 参数page,默认值为 1;再用三元运算符判断:如果 page <= 1 显示"首页",否则显示"第 N 页"。 - 写一个运算符综合练习:给定商品价格和折扣率,计算折后价并格式化输出(保留两位小数)。