PHP运算符
运算符是用于对值或变量执行操作的符号。PHP提供了丰富的运算符集,包括算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符等。本教程将详细介绍这些运算符的使用方法和优先级。
算术运算符
算术运算符用于执行常见的数学运算:
运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
+ | 加法 | $a + $b | $a 和 $b 的和 |
- | 减法 | $a - $b | $a 减去 $b 的差 |
* | 乘法 | $a * $b | $a 和 $b 的积 |
/ | 除法 | $a / $b | $a 除以 $b 的商 |
% | 取模(余数) | $a % $b | $a 除以 $b 的余数 |
** | 幂运算(PHP 5.6+) | $a ** $b | $a 的 $b 次方 |
<?php
$a = 10;
$b = 3;
// 加法
echo "加法: ".($a + $b)."<br>";
// 输出: 加法: 13
// 减法
echo "减法: ".($a - $b)."<br>";
// 输出: 减法: 7
// 乘法
echo "乘法: ".($a * $b)."<br>";
// 输出: 乘法: 30
// 除法
echo "除法: ".($a / $b)."<br>";
// 输出: 除法: 3.3333333333333
// 取模
echo "取模: ".($a % $b)."<br>";
// 输出: 取模: 1
// 幂运算 (PHP 5.6+)
echo "幂运算: ".($a ** $b)."<br>";
// 输出: 幂运算: 1000
?>
赋值运算符
赋值运算符用于向变量赋值:
运算符 | 描述 | 示例 | 等价于 |
---|---|---|---|
= | 基本赋值 | $a = $b | $a = $b |
+= | 加法赋值 | $a += $b | $a = $a + $b |
-= | 减法赋值 | $a -= $b | $a = $a - $b |
*= | 乘法赋值 | $a *= $b | $a = $a * $b |
/= | 除法赋值 | $a /= $b | $a = $a / $b |
%= | 取模赋值 | $a %= $b | $a = $a % $b |
**= | 幂运算赋值(PHP 5.6+) | $a **= $b | $a = $a ** $b |
.= | 字符串连接赋值 | $a .= $b | $a = $a . $b |
<<= | 左移赋值 | $a <<= $b | $a = $a << $b |
>>= | 右移赋值 | $a >>= $b | $a = $a >> $b |
&= | 按位与赋值 | $a &= $b | $a = $a & $b |
|= | 按位或赋值 | $a |= $b | $a = $a | $b |
^= | 按位异或赋值 | $a ^= $b | $a = $a ^ $b |
<?php
$a = 10;
// 基本赋值
$b = $a;
echo "基本赋值 - b: $b<br>";
// 输出: 基本赋值 - b: 10
// 加法赋值
$b += 5;
echo "加法赋值 - b: $b<br>";
// 输出: 加法赋值 - b: 15
// 减法赋值
$b -= 3;
echo "减法赋值 - b: $b<br>";
// 输出: 减法赋值 - b: 12
// 乘法赋值
$b *= 2;
echo "乘法赋值 - b: $b<br>";
// 输出: 乘法赋值 - b: 24
// 除法赋值
$b /= 4;
echo "除法赋值 - b: $b<br>";
// 输出: 除法赋值 - b: 6
// 取模赋值
$b %= 4;
echo "取模赋值 - b: $b<br>";
// 输出: 取模赋值 - b: 2
// 幂运算赋值
$b **= 3;
echo "幂运算赋值 - b: $b<br>";
// 输出: 幂运算赋值 - b: 8
// 字符串连接赋值
$str1 = "Hello ";
$str2 = "World!";
$str1 .= $str2;
echo "字符串连接赋值 - str1: $str1<br>";
// 输出: 字符串连接赋值 - str1: Hello World!
?>
比较运算符
比较运算符用于比较两个值:
运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
== | 等于 | $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 |
<=> | 太空船运算符(PHP 7+) | $a <=> $b | 如果 $a < $b 返回 -1,如果 $a == $b 返回 0,如果 $a > $b 返回 1 |
<?php
$a = 10;
$b = 10;
$c = "10";
$d = 20;
// 等于 (==)
echo "\$a == \$b: ".($a == $b ? "true" : "false")."<br>";
// 输出: $a == $b: true
echo "\$a == \$c: ".($a == $c ? "true" : "false")."<br>";
// 输出: $a == $c: true (类型转换后的值相等)
// 全等 (===
echo "\$a === \$b: ".($a === $b ? "true" : "false")."<br>";
// 输出: $a === $b: true
echo "\$a === \$c: ".($a === $c ? "true" : "false")."<br>";
// 输出: $a === $c: false (类型不同)
// 不等于 (!=)
echo "\$a != \$d: ".($a != $d ? "true" : "false")."<br>";
// 输出: $a != $d: true
// 不等于 (<>)
echo "\$a <> \$d: ".($a <> $d ? "true" : "false")."<br>";
// 输出: $a <> $d: true
// 不全等 (!==
echo "\$a !== \$c: ".($a !== $c ? "true" : "false")."<br>";
// 输出: $a !== $c: true
// 小于 (<)
echo "\$a < \$d: ".($a < $d ? "true" : "false")."<br>";
// 输出: $a < $d: true
// 大于 (>)
echo "\$d > \$a: ".($d > $a ? "true" : "false")."<br>";
// 输出: $d > $a: true
// 小于等于 (<=)
echo "\$a <= \$b: ".($a <= $b ? "true" : "false")."<br>";
// 输出: $a <= $b: true
echo "\$a <= \$d: ".($a <= $d ? "true" : "false")."<br>";
// 输出: $a <= $d: true
// 大于等于 (>=)
echo "\$d >= \$a: ".($d >= $a ? "true" : "false")."<br>";
// 输出: $d >= $a: true
echo "\$b >= \$a: ".($b >= $a ? "true" : "false")."<br>";
// 输出: $b >= $a: true
// 太空船运算符 (<=> - PHP 7+)
echo "\$a <=> \$b: ".($a <=> $b)."<br>";
// 输出: $a <=> $b: 0 (相等)
echo "\$a <=> \$d: ".($a <=> $d)."<br>";
// 输出: $a <=> $d: -1 ($a < $d)
echo "\$d <=> \$a: ".($d <=> $a)."<br>";
// 输出: $d <=> $a: 1 ($d > $a)
?>
逻辑运算符
逻辑运算符用于组合逻辑条件:
运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
&& | 逻辑与 | $a && $b | 如果 $a 和 $b 都为 true,则返回 true |
|| | 逻辑或 | $a || $b | 如果 $a 或 $b 有一个为 true,则返回 true |
! | 逻辑非 | !$a | 如果 $a 不为 true,则返回 true |
& | 逻辑与(不短路) | $a & $b | 如果 $a 和 $b 都为 true,则返回 true(不短路) |
| | 逻辑或(不短路) | $a | $b | 如果 $a 或 $b 有一个为 true,则返回 true(不短路) | xor | 异或 | $a xor $b | 如果 $a 和 $b 中只有一个为 true,则返回 true |
<?php
$a = true;
$b = false;
$c = true;
// 逻辑与 (&&)
echo "\$a && \$c: ".($a && $c ? "true" : "false")."<br>";
// 输出: $a && $c: true
echo "\$a && \$b: ".($a && $b ? "true" : "false")."<br>";
// 输出: $a && $b: false
// 逻辑或 (||)
echo "\$a || \$b: ".($a || $b ? "true" : "false")."<br>";
// 输出: $a || $b: true
echo "\$b || \$b: ".($b || $b ? "true" : "false")."<br>";
// 输出: $b || $b: false
// 逻辑非 (!)
echo "!$a: ".(!$a ? "true" : "false")."<br>";
// 输出: !$a: false
echo "!$b: ".(!$b ? "true" : "false")."<br>";
// 输出: !$b: true
// 异或 (xor)
echo "\$a xor \$b: ".($a xor $b ? "true" : "false")."<br>";
// 输出: $a xor $b: true
echo "\$a xor \$c: ".($a xor $c ? "true" : "false")."<br>";
// 输出: $a xor $c: false
echo "\$b xor \$b: ".($b xor $b ? "true" : "false")."<br>";
// 输出: $b xor $b: false
// 短路逻辑示例
function test_func($val) {
echo "函数被调用,参数值: \$val<br>";
return $val;
}
echo "短路与: ".(test_func(false) && test_func(true))."<br>";
// 输出: 函数被调用,参数值: false
// 短路与:
// 注意:第二个函数没有被调用,因为第一个条件已经为false
echo "<br>短路或: ".(test_func(true) || test_func(false))."<br>";
// 输出: 函数被调用,参数值: true
// 短路或: 1
// 注意:第二个函数没有被调用,因为第一个条件已经为true
echo "<br>不短路与: ".(test_func(false) & test_func(true))."<br>";
// 输出: 函数被调用,参数值: false
// 函数被调用,参数值: true
// 不短路与:
// 注意:两个函数都被调用了
echo "<br>不短路或: ".(test_func(true) | test_func(false))."<br>";
// 输出: 函数被调用,参数值: true
// 函数被调用,参数值: false
// 不短路或: 1
// 注意:两个函数都被调用了
?>
位运算符
位运算符用于对二进制数进行操作:
运算符 | 描述 | 示例 | 结果(二进制) | 结果(十进制) |
---|---|---|---|---|
& | 按位与 | $a & $b | 每一位都为1时,结果位才为1 | - |
| | 按位或 | $a | $b | 任一为1时,结果位为1 | - |
^ | 按位异或 | $a ^ $b | 只有一位为1时,结果位为1 | - |
~ | 按位非(取反) | ~$a | 反转所有位 | - |
<< | 左移 | $a << $b | 将 $a 的位向左移动 $b 位 | $a * 2^$b |
>> | 右移 | $a >> $b | 将 $a 的位向右移动 $b 位 | $a / 2^$b |
<?php
$a = 10; // 二进制: 1010
$b = 6; // 二进制: 0110
// 按位与 (&)
$result = $a & $b;
echo "\$a & \$b = $result (二进制: ".decbin($result).")<br>";
// 输出: $a & $b = 2 (二进制: 10)
// 解释: 1010 & 0110 = 0010
// 按位或 (|)
$result = $a | $b;
echo "\$a | \$b = $result (二进制: ".decbin($result).")<br>";
// 输出: $a | $b = 14 (二进制: 1110)
// 解释: 1010 | 0110 = 1110
// 按位异或 (^)
$result = $a ^ $b;
echo "\$a ^ \$b = $result (二进制: ".decbin($result).")<br>";
// 输出: $a ^ $b = 12 (二进制: 1100)
// 解释: 1010 ^ 0110 = 1100
// 按位非 (~)
$result = ~$a;
echo "~$a = $result (二进制: ".decbin($result).")<br>";
// 输出: ~$a = -11 (二进制: 11111111111111111111111111110101)
// 解释: 在PHP中,整数是有符号的,所以取反操作会得到负数
// 左移 (<<)
$result = $a << 2;
echo "\$a << 2 = $result (二进制: ".decbin($result).")<br>";
// 输出: $a << 2 = 40 (二进制: 101000)
// 解释: 1010 << 2 = 101000 (相当于10 * 2^2 = 40)
// 右移 (>>)
$result = $a >> 2;
echo "\$a >> 2 = $result (二进制: ".decbin($result).")<br>";
// 输出: $a >> 2 = 2 (二进制: 10)
// 解释: 1010 >> 2 = 10 (相当于10 / 2^2 = 2)
?>
递增/递减运算符
递增和递减运算符用于增加或减少变量的值:
运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
++$a | 前递增 | ++$a | $a 增加1,然后返回 $a |
$a++ | 后递增 | $a++ | 返回 $a,然后 $a 增加1 |
--$a | 前递减 | --$a | $a 减少1,然后返回 $a |
$a-- | 后递减 | $a-- | 返回 $a,然后 $a 减少1 |
<?php
// 前递增和后递增
$a = 5;
$b = ++$a; // $a 先增加到6,然后赋值给 $b
echo "前递增: \$a = $a, \$b = $b<br>";
// 输出: 前递增: $a = 6, $b = 6
$a = 5;
$b = $a++; // 先将 $a 的值(5)赋值给 $b,然后 $a 增加到6
echo "后递增: \$a = $a, \$b = $b<br>";
// 输出: 后递增: $a = 6, $b = 5
// 前递减和后递减
$a = 5;
$b = --$a; // $a 先减少到4,然后赋值给 $b
echo "前递减: \$a = $a, \$b = $b<br>";
// 输出: 前递减: $a = 4, $b = 4
$a = 5;
$b = $a--; // 先将 $a 的值(5)赋值给 $b,然后 $a 减少到4
echo "后递减: \$a = $a, \$b = $b<br>";
// 输出: 后递减: $a = 4, $b = 5
// 在表达式中使用
$a = 5;
echo "\$a++ + ++\$a = ".($a++ + ++$a)."<br>";
// 输出: $a++ + ++$a = 12
// 解释: 首先,$a++ 返回5,然后 $a 变成6
// 接着,++$a 使 $a 变成7,然后返回7
// 最后,5 + 7 = 12
?>
字符串运算符
PHP只有一个字符串运算符,即连接运算符(.),用于连接两个字符串:
<?php
$str1 = "Hello";
$str2 = "World";
// 字符串连接
$result = $str1 . " " . $str2 . "!";
echo $result; // 输出: Hello World!
// 字符串连接赋值
$str1 .= " " . $str2 . "!";
echo $str1; // 输出: Hello World!
// 连接不同类型的值
$num = 100;
$str = "The number is: " . $num;
echo $str; // 输出: The number is: 100
?>
数组运算符
数组运算符用于数组之间的操作:
运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
+ | 数组联合 | $a + $b | 返回一个数组,包含 $a 和 $b 的所有元素,如果键名重复,使用 $a 的值 |
== | 相等 | $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 |
<?php
// 数组联合 (+)
$a = array("a" => "apple", "b" => "banana");
$b = array("b" => "blueberry", "c" => "cherry");
$c = $a + $b;
print_r($c);
/* 输出:
Array
(
[a] => apple
[b] => banana // 注意这里使用了$a的"b"值,而不是$b的
[c] => cherry
)
*/
// 数组相等 (==)
$a = array("a" => "apple", "b" => "banana");
$b = array("b" => "banana", "a" => "apple");
echo "\$a == \$b: ".($a == $b ? "true" : "false")."<br>";
// 输出: $a == $b: true (键值对相同,顺序可以不同)
// 数组全等 (===
$a = array("a" => "apple", "b" => "banana");
$b = array("b" => "banana", "a" => "apple");
echo "\$a === \$b: ".($a === $b ? "true" : "false")."<br>";
// 输出: $a === $b: false (顺序不同)
$c = array("a" => "apple", "b" => "banana");
echo "\$a === \$c: ".($a === $c ? "true" : "false")."<br>";
// 输出: $a === $c: true (键值对相同,顺序相同)
?>
条件运算符
条件运算符(也称为三元运算符)是一种简洁的if-else语句:
<?php
// 基本语法: (条件) ? 表达式1 : 表达式2
// 如果条件为真,返回表达式1的值,否则返回表达式2的值
$age = 20;
$status = ($age >= 18) ? "成年人" : "未成年人";
echo "年龄: $age, 状态: $status<br>";
// 输出: 年龄: 20, 状态: 成年人
// 嵌套条件运算符
$score = 85;
$grade = ($score >= 90) ? "优秀" :
($score >= 80) ? "良好" :
($score >= 70) ? "中等" :
($score >= 60) ? "及格" : "不及格";
echo "分数: $score, 等级: $grade<br>";
// 输出: 分数: 85, 等级: 良好
// NULL合并运算符 (PHP 7+)
// 语法: $变量 = $值 ?? 默认值;
// 如果$值存在且不为NULL,返回$值,否则返回默认值
$username = isset($_GET["username"]) ? $_GET["username"] : "访客";
// 等价于
$username = $_GET["username"] ?? "访客";
echo "用户名: $username<br>";
// 合并赋值运算符 (PHP 7.4+)
// 语法: $变量 ??= 默认值;
// 如果$变量为NULL,将默认值赋给$变量
$config["debug"] ??= false;
echo "调试模式: ".($config["debug"] ? "开启" : "关闭")."<br>";
?>
运算符优先级
运算符优先级决定了在没有括号的情况下,表达式中运算符的执行顺序。优先级高的运算符先执行。以下是PHP中运算符的优先级从高到低的列表(不完全):
优先级 | 运算符 | 关联性 |
---|---|---|
1 | clone, new | 无 |
2 | ++ -- ~ (int) (float) (string) (array) (object) (bool) @ | 无 |
3 | ** | 右 |
4 | ! | 右 |
5 | * / % | 左 |
6 | + - . | 左 |
7 | << >> | 左 |
8 | < <= > >= > | 左 |
9 | == != === !== <=> | 左 |
10 | & | 左 |
11 | ^ | 左 |
12 | | | 左 |
13 | && | 左 |
14 | || | 左 |
15 | ?: | 右 |
16 | = += -= *= /= %= **= <<= >>= &= ^= |= .= ??= | 右 |
17 | and | 左 |
18 | xor | 左 |
19 | or | 左 |
在实际编程中,为了代码的可读性和避免因运算符优先级导致的错误,建议使用括号明确指定运算顺序:
<?php
// 以下表达式的结果可能不如预期
$result = 10 + 5 * 2;
echo "10 + 5 * 2 = $result<br>";
// 输出: 10 + 5 * 2 = 20 (乘法优先级高于加法)
// 使用括号明确运算顺序
$result = (10 + 5) * 2;
echo "(10 + 5) * 2 = $result<br>";
// 输出: (10 + 5) * 2 = 30
// 复杂表达式
$a = 5;
$b = 10;
$c = 15;
$result = $a + $b * $c / 2;
echo "$a + $b * $c / 2 = $result<br>";
// 输出: 5 + 10 * 15 / 2 = 80
// 使用括号使表达式更清晰
$result = $a + (($b * $c) / 2);
echo "$a + (($b * $c) / 2) = $result<br>";
// 输出: 5 + ((10 * 15) / 2) = 80
?>
PHP运算符综合示例
<?php
// 1. 算术运算符示例
echo "<h4>1. 算术运算符示例</h4>";
$num1 = 10;
$num2 = 5;
// 基本算术运算
$addition = $num1 + $num2;
$subtraction = $num1 - $num2;
$multiplication = $num1 * $num2;
$division = $num1 / $num2;
$modulus = $num1 % $num2;
$exponentiation = $num1 ** $num2;
// 输出结果
printf("%d + %d = %d<br>", $num1, $num2, $addition);
printf("%d - %d = %d<br>", $num1, $num2, $subtraction);
printf("%d * %d = %d<br>", $num1, $num2, $multiplication);
printf("%d / %d = %f<br>", $num1, $num2, $division);
printf("%d %% %d = %d<br>", $num1, $num2, $modulus);
printf("%d ** %d = %d<br><br>", $num1, $num2, $exponentiation);
// 2. 赋值运算符示例
echo "<h4>2. 赋值运算符示例</h4>";
$a = 10;
echo "初始值: \$a = $a<br>";
$a += 5;
echo "\$a += 5: \$a = $a<br>";
$a -= 3;
echo "\$a -= 3: \$a = $a<br>";
$a *= 2;
echo "\$a *= 2: \$a = $a<br>";
$a /= 4;
echo "\$a /= 4: \$a = $a<br>";
$a %= 3;
echo "\$a %%= 3: \$a = $a<br>";
$a **= 2;
echo "\$a **= 2: \$a = $a<br><br>";
// 字符串连接赋值
$str = "Hello, ";
echo "初始字符串: \$str = '$str'<br>";
$str .= "World!";
echo "\$str .= 'World!': \$str = '$str'<br><br>";
// 3. 比较运算符示例
echo "<h4>3. 比较运算符示例</h4>";
$x = 10;
$y = "10";
$z = 15;
// 比较结果
printf("%d == %s: %s<br>", $x, $y, ($x == $y) ? "true" : "false");
printf("%d === %s: %s<br>", $x, $y, ($x === $y) ? "true" : "false");
printf("%d != %d: %s<br>", $x, $z, ($x != $z) ? "true" : "false");
printf("%d <> %d: %s<br>", $x, $z, ($x <> $z) ? "true" : "false");
printf("%d !== %s: %s<br>", $x, $y, ($x !== $y) ? "true" : "false");
printf("%d < %d: %s<br>", $x, $z, ($x < $z) ? "true" : "false");
printf("%d > %d: %s<br>", $z, $x, ($z > $x) ? "true" : "false");
printf("%d <= %d: %s<br>", $x, $z, ($x <= $z) ? "true" : "false");
printf("%d >= %d: %s<br>", $z, $x, ($z >= $x) ? "true" : "false");
// PHP 7+ 太空船运算符
if (version_compare(PHP_VERSION, '7.0.0', '>=')) {
printf("%d <=> %d: %d<br>", $x, $z, $x <=> $z);
printf("%d <=> %d: %d<br>", $x, $x, $x <=> $x);
printf("%d <=> %d: %d<br>", $z, $x, $z <=> $x);
}
echo "<br>";
// 4. 逻辑运算符示例
echo "<h4>4. 逻辑运算符示例</h4>";
$is_admin = true;
$is_logged_in = true;
$has_permission = false;
// 逻辑与示例
if ($is_admin && $is_logged_in) {
echo "用户是管理员且已登录<br>";
} else {
echo "用户不是管理员或未登录<br>";
}
// 逻辑或示例
if ($is_admin || $has_permission) {
echo "用户是管理员或有权限<br>";
} else {
echo "用户不是管理员且没有权限<br>";
}
// 逻辑非示例
if (!$has_permission) {
echo "用户没有权限<br>";
} else {
echo "用户有权限<br>";
}
// 异或示例
if ($is_admin xor $has_permission) {
echo "用户是管理员或者有权限,但不是同时具备<br>";
} else {
echo "用户同时具备管理员身份和权限,或者都不具备<br>";
}
echo "<br>";
// 5. 短路逻辑示例
echo "<h4>5. 短路逻辑示例</h4>";
function check_value($value, $name) {
echo "检查变量$name的值: $value<br>";
return $value;
}
echo "短路与示例: <br>";
// 第二个函数不会被调用,因为第一个条件已经为false
$result = check_value(false, "a") && check_value(true, "b");
echo "结果: ".($result ? "true" : "false")."<br><br>";
echo "短路或示例: <br>";
// 第二个函数不会被调用,因为第一个条件已经为true
$result = check_value(true, "a") || check_value(false, "b");
echo "结果: ".($result ? "true" : "false")."<br><br>";
echo "<br>";
// 6. 位运算符示例
echo "<h4>6. 位运算符示例</h4>";
$bit1 = 10; // 二进制: 1010
$bit2 = 6; // 二进制: 0110
// 位运算结果
$bit_and = $bit1 & $bit2;
$bit_or = $bit1 | $bit2;
$bit_xor = $bit1 ^ $bit2;
$bit_not = ~$bit1;
$bit_left = $bit1 << 2;
$bit_right = $bit1 >> 2;
// 输出结果
printf("%d (%s) & %d (%s) = %d (%s)<br>",
$bit1, decbin($bit1), $bit2, decbin($bit2), $bit_and, decbin($bit_and));
printf("%d (%s) | %d (%s) = %d (%s)<br>",
$bit1, decbin($bit1), $bit2, decbin($bit2), $bit_or, decbin($bit_or));
printf("%d (%s) ^ %d (%s) = %d (%s)<br>",
$bit1, decbin($bit1), $bit2, decbin($bit2), $bit_xor, decbin($bit_xor));
printf("~%d (%s) = %d (%s)<br>",
$bit1, decbin($bit1), $bit_not, decbin($bit_not));
printf("%d (%s) << 2 = %d (%s)<br>",
$bit1, decbin($bit1), $bit_left, decbin($bit_left));
printf("%d (%s) >> 2 = %d (%s)<br><br>",
$bit1, decbin($bit1), $bit_right, decbin($bit_right));
// 7. 递增/递减运算符示例
echo "<h4>7. 递增/递减运算符示例</h4>";
$count = 5;
echo "初始值: \$count = $count<br>";
echo "前递增: ".(++$count).", 递增后: \$count = $count<br>";
echo "后递增: ".($count++).", 递增后: \$count = $count<br>";
echo "前递减: ".(--$count).", 递减后: \$count = $count<br>";
echo "后递减: ".($count--).", 递减后: \$count = $count<br><br>";
// 8. 条件运算符示例
echo "<h4>8. 条件运算符示例</h4>";
// 简单条件运算符
$age = 20;
$status = ($age >= 18) ? "成年人" : "未成年人";
echo "年龄: $age, 状态: $status<br>";
// 嵌套条件运算符
$score = 75;
grade = ($score >= 90) ? "优秀" :
($score >= 80) ? "良好" :
($score >= 70) ? "中等" :
($score >= 60) ? "及格" : "不及格";
echo "分数: $score, 等级: $grade<br>";
// NULL合并运算符 (PHP 7+)
if (version_compare(PHP_VERSION, '7.0.0', '>=')) {
$username = $_GET["username"] ?? "访客";
echo "用户名: $username<br>";
}
// 合并赋值运算符 (PHP 7.4+)
if (version_compare(PHP_VERSION, '7.4.0', '>=')) {
$config["debug"] ??= false;
echo "调试模式: ".($config["debug"] ? "开启" : "关闭")."<br>";
}
echo "<br>";
// 9. 实际应用示例
echo "<h4>9. 实际应用示例</h4>";
// 示例1: 计算购物车总价
function calculate_total($items, $tax_rate = 0.08) {
$subtotal = 0;
// 计算小计
foreach ($items as $item) {
$subtotal += $item["price"] * $item["quantity"];
}
// 计算税费和总价
$tax = $subtotal * $tax_rate;
$total = $subtotal + $tax;
return array(
"subtotal" => $subtotal,
"tax" => $tax,
"total" => $total
);
}
// 购物车项目
$cart_items = array(
array("name" => "商品A", "price" => 19.99, "quantity" => 2),
array("name" => "商品B", "price" => 29.99, "quantity" => 1),
array("name" => "商品C", "price" => 9.99, "quantity" => 3)
);
// 计算总价
$order_summary = calculate_total($cart_items);
// 输出订单摘要
printf("小计: $%.2f<br>", $order_summary["subtotal"]);
printf("税费 (8%%): $%.2f<br>", $order_summary["tax"]);
printf("总计: $%.2f<br><br>", $order_summary["total"]);
// 示例2: 验证表单输入
function validate_form($data) {
$errors = array();
// 检查用户名
if (empty($data["username"])) {
$errors[] = "用户名不能为空";
} else if (strlen($data["username"]) < 3) {
$errors[] = "用户名至少需要3个字符";
}
// 检查邮箱
if (empty($data["email"])) {
$errors[] = "邮箱不能为空";
} else if (!filter_var($data["email"], FILTER_VALIDATE_EMAIL)) {
$errors[] = "请输入有效的邮箱地址";
}
// 检查密码
if (empty($data["password"])) {
$errors[] = "密码不能为空";
} else if (strlen($data["password"]) < 6) {
$errors[] = "密码至少需要6个字符";
}
return $errors;
}
// 模拟表单数据
$form_data = array(
"username" => "john",
"email" => "invalid-email",
"password" => "123"
);
// 验证表单
$validation_errors = validate_form($form_data);
// 输出验证结果
if (empty($validation_errors)) {
echo "表单验证通过!<br>";
} else {
echo "表单验证失败,错误信息:<br>";
foreach ($validation_errors as $error) {
echo "- $error<br>";
}
}
echo "<br>";
// 示例3: 使用位运算符管理权限
// 定义权限位
define("PERM_READ", 1); // 1 << 0 = 1
define("PERM_WRITE", 2); // 1 << 1 = 2
define("PERM_DELETE", 4); // 1 << 2 = 4
define("PERM_ADMIN", 8); // 1 << 3 = 8
// 用户权限
$user_permissions = PERM_READ | PERM_WRITE; // 1 | 2 = 3
// 检查权限函数
function has_permission($user_permissions, $permission) {
return ($user_permissions & $permission) === $permission;
}
// 检查各种权限
printf("读取权限: %s<br>", has_permission($user_permissions, PERM_READ) ? "有" : "无");
printf("写入权限: %s<br>", has_permission($user_permissions, PERM_WRITE) ? "有" : "无");
printf("删除权限: %s<br>", has_permission($user_permissions, PERM_DELETE) ? "有" : "无");
printf("管理权限: %s<br>", has_permission($user_permissions, PERM_ADMIN) ? "有" : "无");
// 添加权限
$user_permissions |= PERM_DELETE;
printf("添加删除权限后: %s<br>", has_permission($user_permissions, PERM_DELETE) ? "有" : "无");
// 移除权限
$user_permissions &= ~PERM_WRITE;
printf("移除写入权限后: %s<br>", has_permission($user_permissions, PERM_WRITE) ? "有" : "无");
?>