PHP运算符

全面学习PHP中的各种运算符及其使用

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程序,实现以下功能:

  1. 使用各种算术运算符进行数学计算
  2. 使用比较运算符比较不同的值
  3. 使用逻辑运算符组合多个条件
  4. 使用字符串运算符连接和处理字符串
  5. 使用位运算符进行二进制操作
  6. 使用三元运算符和NULL合并运算符简化条件判断
  7. 创建复杂的表达式并理解运算符优先级
  8. 实现一个简单的计算器功能
提示: 可以使用表单接收用户输入,然后使用各种运算符处理数据并显示结果。
综合练习示例
<?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>";
?>