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) ? "有" : "无");
?>