PHP运算符概述
运算符是用于执行程序代码运算的符号,PHP支持多种类型的运算符。
运算符分类:
- 算术运算符: 用于基本数学运算
- 赋值运算符: 用于给变量赋值
- 比较运算符: 用于比较两个值
- 逻辑运算符: 用于组合条件
- 字符串运算符: 用于字符串操作
- 位运算符: 用于二进制位操作
- 其他运算符: 包括三元运算符、错误控制运算符等
算术运算符
算术运算符用于执行基本的数学运算。
| 运算符 | 名称 | 示例 | 结果 |
|---|---|---|---|
| + | 加法 | $a + $b | $a 和 $b 的和 |
| - | 减法 | $a - $b | $a 和 $b 的差 |
| * | 乘法 | $a * $b | $a 和 $b 的积 |
| / | 除法 | $a / $b | $a 和 $b 的商 |
| % | 取模 | $a % $b | $a 除以 $b 的余数 |
| ** | 指数 | $a ** $b | $a 的 $b 次方 |
算术运算符示例
<?php
$a = 10;
$b = 3;
echo "a = $a, b = $b<br><br>";
echo "加法: $a + $b = " . ($a + $b) . "<br>";
echo "减法: $a - $b = " . ($a - $b) . "<br>";
echo "乘法: $a * $b = " . ($a * $b) . "<br>";
echo "除法: $a / $b = " . ($a / $b) . "<br>";
echo "取模: $a % $b = " . ($a % $b) . "<br>";
echo "指数: $a ** $b = " . ($a ** $b) . "<br>";
// 处理浮点数
$x = 10.5;
$y = 3.2;
echo "<br>浮点数运算:<br>";
echo "$x + $y = " . ($x + $y) . "<br>";
echo "$x * $y = " . ($x * $y) . "<br>";
?>
赋值运算符
赋值运算符用于给变量赋值。
| 运算符 | 等同于 | 描述 |
|---|---|---|
| = | 基本赋值 | |
| += | $a = $a + $b | 加法赋值 |
| -= | $a = $a - $b | 减法赋值 |
| *= | $a = $a * $b | 乘法赋值 |
| /= | $a = $a / $b | 除法赋值 |
| %= | $a = $a % $b | 取模赋值 |
| .= | $a = $a . $b | 连接赋值 |
赋值运算符示例
<?php
// 基本赋值
$a = 10;
echo "a = $a<br>";
// 加法赋值
$a += 5; // 等同于 $a = $a + 5
echo "a += 5: $a<br>";
// 减法赋值
$a -= 3; // 等同于 $a = $a - 3
echo "a -= 3: $a<br>";
// 乘法赋值
$a *= 2; // 等同于 $a = $a * 2
echo "a *= 2: $a<br>";
// 字符串连接赋值
$str = "Hello";
$str .= " World"; // 等同于 $str = $str . " World"
echo "str: $str<br>";
// 复合赋值示例
$number = 100;
$number /= 4; // $number = $number / 4
echo "number /= 4: $number<br>";
$number %= 7; // $number = $number % 7
echo "number %= 7: $number<br>";
?>
比较运算符
比较运算符用于比较两个值,返回布尔值(true 或 false)。
| 运算符 | 名称 | 示例 | 结果 |
|---|---|---|---|
| == | 等于 | $a == $b | 如果 $a 等于 $b 返回 true |
| === | 全等 | $a === $b | 如果 $a 等于 $b 且类型相同返回 true |
| != | 不等于 | $a != $b | 如果 $a 不等于 $b 返回 true |
| <> | 不等于 | $a <> $b | 如果 $a 不等于 $b 返回 true |
| !== | 不全等 | $a !== $b | 如果 $a 不等于 $b 或类型不同返回 true |
| < | 小于 | $a < $b | 如果 $a 小于 $b 返回 true |
| > | 大于 | $a > $b | 如果 $a 大于 $b 返回 true |
| <= | 小于等于 | $a <= $b | 如果 $a 小于或等于 $b 返回 true |
| >= | 大于等于 | $a >= $b | 如果 $a 大于或等于 $b 返回 true |
| <=> | 太空船运算符 | $a <=> $b | 小于返回-1,等于返回0,大于返回1 |
比较运算符示例
<?php
$a = 5;
$b = "5";
$c = 10;
echo "a = $a (整数), b = '$b' (字符串), c = $c<br><br>";
echo "a == b: " . ($a == $b ? "true" : "false") . "<br>"; // true (值相等)
echo "a === b: " . ($a === $b ? "true" : "false") . "<br>"; // false (类型不同)
echo "a != b: " . ($a != $b ? "true" : "false") . "<br>"; // false
echo "a !== b: " . ($a !== $b ? "true" : "false") . "<br>"; // true
echo "a < c: " . ($a < $c ? "true" : "false") . "<br>"; // true
echo "a > c: " . ($a > $c ? "true" : "false") . "<br>"; // false
// 太空船运算符 (PHP 7+)
echo "<br>太空船运算符:<br>";
echo "a <=> b: " . ($a <=> $b) . "<br>"; // 0 (相等)
echo "a <=> c: " . ($a <=> $c) . "<br>"; // -1 (a小于c)
echo "c <=> a: " . ($c <=> $a) . "<br>"; // 1 (c大于a)
// 字符串比较
$str1 = "apple";
$str2 = "banana";
echo "<br>字符串比较:<br>";
echo "'$str1' == '$str2': " . ($str1 == $str2 ? "true" : "false") . "<br>";
echo "'$str1' < '$str2': " . ($str1 < $str2 ? "true" : "false") . "<br>"; // 按字母顺序比较
?>
逻辑运算符
逻辑运算符用于组合条件表达式。
| 运算符 | 名称 | 示例 | 结果 |
|---|---|---|---|
| and | 与 | $a and $b | 如果 $a 和 $b 都为 true 返回 true |
| or | 或 | $a or $b | 如果 $a 或 $b 任一为 true 返回 true |
| xor | 异或 | $a xor $b | 如果 $a 或 $b 任一为 true 但不同时为 true 返回 true |
| ! | 非 | !$a | 如果 $a 不为 true 返回 true |
| && | 与 | $a && $b | 如果 $a 和 $b 都为 true 返回 true |
| || | 或 | $a || $b | 如果 $a 或 $b 任一为 true 返回 true |
逻辑运算符示例
<?php
$a = true;
$b = false;
$age = 25;
$score = 85;
echo "逻辑运算:<br>";
echo "a && b: " . ($a && $b ? "true" : "false") . "<br>";
echo "a || b: " . ($a || $b ? "true" : "false") . "<br>";
echo "!a: " . (!$a ? "true" : "false") . "<br>";
echo "a xor b: " . ($a xor $b ? "true" : "false") . "<br>";
echo "<br>实际应用:<br>";
echo "年龄: $age, 分数: $score<br>";
// 组合条件
$isAdult = $age >= 18;
$isGoodScore = $score >= 80;
echo "是成年人且成绩优秀: " . ($isAdult && $isGoodScore ? "是" : "否") . "<br>";
echo "是成年人或成绩优秀: " . ($isAdult || $isGoodScore ? "是" : "否") . "<br>";
echo "不是成年人: " . (!$isAdult ? "是" : "否") . "<br>";
// 短路求值
$x = false;
$y = true;
testFunc() || testFunc2(); // 只会调用 testFunc()
function testFunc() {
echo "testFunc 被调用<br>";
return true;
}
function testFunc2() {
echo "testFunc2 被调用<br>";
return true;
}
?>
字符串运算符
PHP有两个字符串运算符:连接运算符和连接赋值运算符。
| 运算符 | 名称 | 示例 | 结果 |
|---|---|---|---|
| . | 连接 | $a . $b | $a 和 $b 的连接 |
| .= | 连接赋值 | $a .= $b | $a = $a . $b |
字符串运算符示例
<?php
$str1 = "Hello";
$str2 = "World";
$name = "张三";
echo "基本连接: " . $str1 . " " . $str2 . "<br>";
echo "带变量的连接: 你好," . $name . "!<br>";
// 连接赋值
$message = "欢迎";
$message .= "来到";
$message .= "PHP世界!";
echo "连接赋值结果: $message<br>";
// 与数字的连接
$number = 42;
echo "数字 " . $number . " 是一个很好的数字<br>";
// 多行字符串连接
$html = "<div>";
$html .= "<h1>标题</h1>";
$html .= "<p>这是一个段落</p>";
$html .= "</div>";
echo $html . "<br>";
?>
位运算符
位运算符用于对整数进行二进制位操作。
| 运算符 | 名称 | 示例 | 结果 |
|---|---|---|---|
| & | 与 | $a & $b | 按位与 |
| | | 或 | $a | $b | 按位或 |
| ^ | 异或 | $a ^ $b | 按位异或 |
| ~ | 非 | ~$a | 按位取反 |
| << | 左移 | $a << $b | 左移 $b 位 |
| >> | 右移 | $a >> $b | 右移 $b 位 |
位运算符示例
<?php
$a = 5; // 二进制: 0101
$b = 3; // 二进制: 0011
echo "a = $a (二进制: " . decbin($a) . "), b = $b (二进制: " . decbin($b) . ")<br><br>";
echo "按位与 (a & b): " . ($a & $b) . " (二进制: " . decbin($a & $b) . ")<br>";
echo "按位或 (a | b): " . ($a | $b) . " (二进制: " . decbin($a | $b) . ")<br>";
echo "按位异或 (a ^ b): " . ($a ^ $b) . " (二进制: " . decbin($a ^ $b) . ")<br>";
echo "按位取反 (~a): " . (~$a) . " (二进制: " . decbin(~$a) . ")<br>";
echo "<br>位移运算:<br>";
echo "左移 (a << 1): " . ($a << 1) . " (二进制: " . decbin($a << 1) . ")<br>";
echo "右移 (a >> 1): " . ($a >> 1) . " (二进制: " . decbin($a >> 1) . ")<br>";
// 实际应用:权限控制
echo "<br>位运算实际应用 - 权限控制:<br>";
define('READ', 1); // 0001
define('WRITE', 2); // 0010
define('DELETE', 4); // 0100
$userPermissions = READ | WRITE; // 用户有读和写权限
echo "用户权限: " . decbin($userPermissions) . "<br>";
echo "有读权限: " . (($userPermissions & READ) ? "是" : "否") . "<br>";
echo "有写权限: " . (($userPermissions & WRITE) ? "是" : "否") . "<br>";
echo "有删除权限: " . (($userPermissions & DELETE) ? "是" : "否") . "<br>";
?>
其他运算符
三元运算符
三元运算符示例
<?php
$age = 20;
// 基本三元运算符
$status = ($age >= 18) ? "成年人" : "未成年人";
echo "年龄 $age: $status<br>";
// 嵌套三元运算符
$score = 85;
$grade = ($score >= 90) ? "优秀" :
(($score >= 80) ? "良好" :
(($score >= 60) ? "及格" : "不及格"));
echo "分数 $score: $grade<br>";
// 简写三元运算符 (PHP 5.3+)
$username = "";
$displayName = $username ?: "匿名用户";
echo "显示名称: $displayName<br>";
?>
NULL合并运算符
NULL合并运算符示例
<?php
// NULL合并运算符 (PHP 7+)
$value = null;
$result = $value ?? "默认值";
echo "结果: $result<br>"; // 输出: 默认值
$username = null;
$email = "user@example.com";
$contact = $username ?? $email ?? "未知";
echo "联系方式: $contact<br>"; // 输出: user@example.com
// 与三元运算符的区别
$data = "";
$result1 = isset($data) ? $data : "默认";
$result2 = $data ?? "默认";
echo "三元运算符: $result1<br>"; // 输出: (空字符串)
echo "NULL合并: $result2<br>"; // 输出: (空字符串)
$data = null;
$result1 = isset($data) ? $data : "默认";
$result2 = $data ?? "默认";
echo "三元运算符: $result1<br>"; // 输出: 默认
echo "NULL合并: $result2<br>"; // 输出: 默认
?>
错误控制运算符
错误控制运算符示例
<?php
// 错误控制运算符 @
$file = @file('nonexistent_file.txt');
if ($file === false) {
echo "文件不存在,但错误被抑制了<br>";
}
// 对比不使用 @
// $file = file('nonexistent_file.txt'); // 会产生警告
// 执行运算符
$output = `dir`; // 在Windows系统中执行dir命令
echo "<pre>$output</pre>";
// 类型运算符 instanceof
class MyClass {}
class AnotherClass {}
$obj = new MyClass();
echo "obj是MyClass的实例: " . ($obj instanceof MyClass ? "是" : "否") . "<br>";
echo "obj是AnotherClass的实例: " . ($obj instanceof AnotherClass ? "是" : "否") . "<br>";
?>
运算符优先级
运算符优先级决定了表达式中运算的执行顺序。
| 优先级 | 运算符 | 结合性 |
|---|---|---|
| 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 | ?? | 左 |
| 17 | ? : | 右 |
| 18 | =, +=, -=, *=, **=, /=, .=, %=, &=, |=, ^=, <<=, >>= | 右 |
| 19 | and | 左 |
| 20 | xor | 左 |
| 21 | or | 左 |
运算符优先级示例
<?php
// 优先级示例
$result1 = 2 + 3 * 4; // 3*4先计算,然后+2 = 14
$result2 = (2 + 3) * 4; // 2+3先计算,然后*4 = 20
echo "2 + 3 * 4 = $result1<br>";
echo "(2 + 3) * 4 = $result2<br>";
// 逻辑运算符优先级
$a = true;
$b = false;
$c = true;
$result3 = $a && $b || $c; // 等同于 ($a && $b) || $c
$result4 = $a && ($b || $c); // 使用括号改变优先级
echo "a && b || c: " . ($result3 ? "true" : "false") . "<br>";
echo "a && (b || c): " . ($result4 ? "true" : "false") . "<br>";
// 赋值运算符优先级
$x = $y = 10; // 从右向左结合:$y = 10, 然后 $x = $y
echo "x = $x, y = $y<br>";
// 复杂表达式
$value = 5 + 3 * 2 ** 2; // 2**2=4, 3*4=12, 5+12=17
echo "5 + 3 * 2 ** 2 = $value<br>";
?>
实践练习
创建一个PHP程序,实现以下功能:
- 使用各种算术运算符进行数学计算
- 使用比较运算符比较不同的值
- 使用逻辑运算符组合多个条件
- 使用字符串运算符连接和处理字符串
- 使用位运算符进行二进制操作
- 使用三元运算符和NULL合并运算符简化条件判断
- 创建复杂的表达式并理解运算符优先级
- 实现一个简单的计算器功能
提示: 可以使用表单接收用户输入,然后使用各种运算符处理数据并显示结果。
综合练习示例
<?php
// 综合运算符应用示例
$number1 = 15;
$number2 = 7;
$text1 = "Hello";
$text2 = "PHP";
// 综合运算
$result = (($number1 + $number2) * 2) ** 2;
echo "综合运算结果: $result<br>";
// 字符串和数字混合运算
$combined = $text1 . " " . $text2 . " - 数字: " . ($number1 + $number2);
echo "组合结果: $combined<br>";
// 复杂条件判断
$age = 25;
$hasLicense = true;
$hasCar = false;
$canDrive = ($age >= 18 && $hasLicense) || $hasCar;
echo "可以驾驶: " . ($canDrive ? "是" : "否") . "<br>";
// 使用位运算的标志系统
define('FLAG_A', 1); // 0001
define('FLAG_B', 2); // 0010
define('FLAG_C', 4); // 0100
define('FLAG_D', 8); // 1000
$userFlags = FLAG_A | FLAG_C | FLAG_D; // 1101
echo "用户标志: " . decbin($userFlags) . "<br>";
echo "有标志A: " . (($userFlags & FLAG_A) ? "是" : "否") . "<br>";
echo "有标志B: " . (($userFlags & FLAG_B) ? "是" : "否") . "<br>";
echo "有标志C: " . (($userFlags & FLAG_C) ? "是" : "否") . "<br>";
echo "有标志D: " . (($userFlags & FLAG_D) ? "是" : "否") . "<br>";
?>