Skip to content

运算符

1. 概述

运算符是 PHP 语言中用于执行各种操作的符号,它们允许我们对变量和值进行计算、比较和逻辑操作。PHP 支持多种类型的运算符,包括算术运算符、比较运算符、逻辑运算符、赋值运算符等。本知识点将详细介绍 PHP 的各种运算符,帮助初学者掌握 PHP 的基本操作能力。

2. 基本概念

2.1 语法

算术运算符

  • + (加法)
  • - (减法)
  • * (乘法)
  • / (除法)
  • % (取模)
  • ** (幂运算,PHP 5.6+)

比较运算符

  • == (等于)
  • === (恒等于)
  • !=<> (不等于)
  • !== (不恒等于)
  • < (小于)
  • > (大于)
  • <= (小于等于)
  • >= (大于等于)

逻辑运算符

  • &&and (逻辑与)
  • ||or (逻辑或)
  • !not (逻辑非)
  • xor (逻辑异或)

赋值运算符

  • = (赋值)
  • += (加赋值)
  • -= (减赋值)
  • *= (乘赋值)
  • /= (除赋值)
  • %= (取模赋值)
  • **= (幂赋值,PHP 5.6+)
  • .= (连接赋值)

其他运算符

  • . (字符串连接)
  • ++ (自增)
  • -- (自减)
  • ?: (三元运算符)
  • ?? (空合并运算符,PHP 7+)
  • -> (对象成员访问)
  • :: (类静态成员访问)

2.2 语义

  • 算术运算符:用于执行基本的数学运算
  • 比较运算符:用于比较两个值的大小或相等性
  • 逻辑运算符:用于执行逻辑操作,返回布尔值
  • 赋值运算符:用于给变量赋值
  • 其他运算符:用于执行特定的操作,如字符串连接、自增/自减等

2.3 规范

  • 了解运算符的优先级和结合性
  • 使用括号明确运算顺序
  • 选择合适的运算符进行操作
  • 避免过度使用复杂的运算符表达式

3. 原理深度解析

3.1 运算符优先级

PHP 运算符具有不同的优先级,决定了运算的执行顺序。优先级高的运算符先执行,优先级低的运算符后执行。如果优先级相同,则按照结合性决定执行顺序。

优先级从高到低

  1. 括号 ()
  2. 递增/递减 ++, --
  3. 幂运算 **
  4. 单目运算符 +, -, !
  5. 乘法/除法/取模 *, /, %
  6. 加法/减法/字符串连接 +, -, .
  7. 比较运算符 <, <=, >, >=
  8. 相等性运算符 ==, !=, ===, !==
  9. 逻辑与 &&
  10. 逻辑或 ||
  11. 三元运算符 ?:
  12. 赋值运算符 =, +=, -=, 等

3.2 运算符结合性

当多个优先级相同的运算符连续出现时,结合性决定了运算的执行顺序。

  • 左结合:从左到右执行,如 a + b + c 执行顺序为 (a + b) + c
  • 右结合:从右到左执行,如 a = b = c 执行顺序为 a = (b = c)

4. 常见错误与踩坑点

4.1 算术运算符错误

错误表现:除法运算结果不符合预期 产生原因

  • 整数除法会截断小数部分
  • 除数为零导致错误 解决方案
  • 使用浮点除法或类型转换
  • 确保除数不为零

错误表现:取模运算结果不符合预期 产生原因

  • 负数取模的结果符号取决于被除数
  • 取模运算的操作数必须是整数 解决方案
  • 了解取模运算的规则
  • 确保操作数是整数

4.2 比较运算符错误

错误表现===== 混用导致的错误 产生原因

  • == 会进行类型转换,可能导致意外的结果
  • === 同时比较值和类型,更严格 解决方案
  • 明确比较的意图,选择合适的比较运算符
  • 了解 ===== 的区别

错误表现:字符串比较时的字典序问题 产生原因:字符串比较使用字典序,可能与数值比较结果不同 解决方案

  • 了解字符串比较的规则
  • 需要数值比较时,先进行类型转换

4.3 逻辑运算符错误

错误表现:逻辑运算符优先级导致的错误 产生原因

  • 逻辑运算符的优先级较低,可能被其他运算符优先执行 解决方案
  • 使用括号明确运算顺序
  • 了解运算符的优先级

错误表现:短路求值导致的副作用 产生原因

  • &&|| 运算符具有短路求值特性
  • 当第一个操作数已经确定结果时,第二个操作数不会执行 解决方案
  • 了解短路求值的特性
  • 避免在逻辑表达式中包含有副作用的操作

5. 常见应用场景

5.1 算术运算

场景描述:执行基本的数学运算 使用方法:使用算术运算符 示例代码

php
<?php
$a = 10;
$b = 5;

echo "加法:" . ($a + $b) . "<br>";
echo "减法:" . ($a - $b) . "<br>";
echo "乘法:" . ($a * $b) . "<br>";
echo "除法:" . ($a / $b) . "<br>";
echo "取模:" . ($a % $b) . "<br>";
echo "幂运算:" . ($a ** $b) . "<br>";
?>

5.2 比较运算

场景描述:比较两个值的大小或相等性 使用方法:使用比较运算符 示例代码

php
<?php
$a = 10;
$b = "10";

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>";
echo "a <= b: " . ($a <= $b) . "<br>";
echo "a >= b: " . ($a >= $b) . "<br>";
?>

5.3 逻辑运算

场景描述:执行逻辑操作 使用方法:使用逻辑运算符 示例代码

php
<?php
$a = true;
$b = false;

echo "a && b: " . ($a && $b) . "<br>";
echo "a || b: " . ($a || $b) . "<br>";
echo "!a: " . !$a . "<br>";
echo "a xor b: " . ($a xor $b) . "<br>";
?>

5.4 赋值运算

场景描述:给变量赋值或执行复合赋值操作 使用方法:使用赋值运算符 示例代码

php
<?php
$a = 10;
echo "初始值:" . $a . "<br>";

$a += 5;
echo "加赋值:" . $a . "<br>";

$a -= 3;
echo "减赋值:" . $a . "<br>";

$a *= 2;
echo "乘赋值:" . $a . "<br>";

$a /= 4;
echo "除赋值:" . $a . "<br>";

$a %= 3;
echo "取模赋值:" . $a . "<br>";

$str = "Hello";
$str .= " World";
echo "连接赋值:" . $str . "<br>";
?>

5.5 其他运算

场景描述:使用其他类型的运算符 使用方法:使用特定的运算符 示例代码

php
<?php
// 自增/自减
$a = 5;
echo "初始值:" . $a . "<br>";
echo "++a: " . ++$a . "<br>";
echo "a++: " . $a++ . "<br>";
echo "最终值:" . $a . "<br>";

// 三元运算符
$age = 18;
$status = $age >= 18 ? "成年" : "未成年";
echo "状态:" . $status . "<br>";

// 空合并运算符 (PHP 7+)
$name = null;
$defaultName = "默认名称";
$result = $name ?? $defaultName;
echo "结果:" . $result . "<br>";

// 字符串连接
$firstName = "张";
$lastName = "三";
$fullName = $firstName . $lastName;
echo "全名:" . $fullName . "<br>";
?>

6. 企业级进阶应用场景

6.1 复杂表达式

场景描述:处理复杂的表达式 使用方法:结合多种运算符,使用括号明确运算顺序 示例代码

php
<?php
// 复杂表达式
$a = 10;
$b = 5;
$c = 3;

$result = ($a + $b) * $c / 2;
echo "结果:" . $result . "<br>";

// 逻辑表达式
$age = 25;
$hasLicense = true;
$hasCar = false;

$canDrive = $age >= 18 && $hasLicense && ($hasCar || true);
echo "是否可以开车:" . ($canDrive ? "是" : "否") . "<br>";
?>

6.2 运算符优先级应用

场景描述:利用运算符优先级简化代码 使用方法:了解并正确应用运算符优先级 示例代码

php
<?php
// 利用运算符优先级
$a = 10;
$b = 5;
$c = 3;

// 等价于 ($a + $b) * $c
$result = $a + $b * $c;
echo "结果:" . $result . "<br>";

// 使用括号明确运算顺序
$result = ($a + $b) * $c;
echo "结果:" . $result . "<br>";
?>

7. 行业最佳实践

7.1 运算符使用

实践内容

  • 了解运算符的优先级和结合性
  • 使用括号明确运算顺序,提高代码可读性
  • 选择合适的运算符进行操作
  • 避免过度使用复杂的运算符表达式 推荐理由:提高代码的可读性和可维护性,减少错误

7.2 比较运算符

实践内容

  • 优先使用 ===!== 进行比较
  • 避免在比较中依赖类型转换
  • 了解字符串比较的规则 推荐理由:减少意外的类型转换,提高代码的可靠性

7.3 逻辑运算符

实践内容

  • 了解短路求值的特性
  • 避免在逻辑表达式中包含有副作用的操作
  • 使用括号明确逻辑运算的顺序 推荐理由:提高代码的可读性和可靠性,避免意外的副作用

8. 常见问题答疑(FAQ)

8.1 算术运算符的优先级是什么?

问题描述:算术运算符的优先级顺序 回答内容:幂运算 > 乘法/除法/取模 > 加法/减法 示例代码

php
<?php
echo 2 + 3 * 4; // 输出 14,因为乘法优先级高于加法
echo 2 ** 3 * 4; // 输出 32,因为幂运算优先级高于乘法
?>

8.2 ===== 有什么区别?

问题描述:比较运算符 ===== 的区别 回答内容

  • == 只比较值,会进行类型转换
  • === 同时比较值和类型,不会进行类型转换 示例代码
php
<?php
echo ("10" == 10); // 输出 1 (true)
echo ("10" === 10); // 输出 0 (false)
?>

8.3 逻辑运算符的短路求值是什么意思?

问题描述:逻辑运算符的短路求值特性 回答内容:当第一个操作数已经确定结果时,第二个操作数不会执行 示例代码

php
<?php
$a = true;
$b = false;

// $b 不会被执行,因为 $a 已经为 true
$a || $b;

// $b 不会被执行,因为 $a 已经为 false
$a && $b;
?>

8.4 如何使用三元运算符?

问题描述:三元运算符的使用方法 回答内容:三元运算符的语法是 条件 ? 值1 : 值2,当条件为真时返回值1,否则返回值2 示例代码

php
<?php
$age = 18;
$status = $age >= 18 ? "成年" : "未成年";
echo $status; // 输出 "成年"
?>

8.5 空合并运算符 ?? 有什么作用?

问题描述:空合并运算符的作用和使用方法 回答内容:空合并运算符用于检查变量是否为 null,如果不为 null 则返回变量值,否则返回默认值 示例代码

php
<?php
$name = null;
$defaultName = "默认名称";
$result = $name ?? $defaultName;
echo $result; // 输出 "默认名称"
?>

8.6 自增和自减运算符的前缀和后缀有什么区别?

问题描述:自增和自减运算符的前缀和后缀形式的区别 回答内容

  • 前缀形式(++$a):先自增/自减,再返回值
  • 后缀形式($a++):先返回值,再自增/自减 示例代码
php
<?php
$a = 5;
echo ++$a; // 输出 6,先自增后返回
echo $a++; // 输出 6,先返回后自增
echo $a; // 输出 7
?>

9. 实战练习

9.1 基础练习

题目:使用算术运算符进行基本计算 解题思路:使用各种算术运算符进行计算 常见误区:运算符优先级错误,除法运算的小数处理 分步提示

  1. 创建一个名为 practice1.php 的文件
  2. 定义两个变量
  3. 使用各种算术运算符进行计算
  4. 输出计算结果
  5. 运行文件查看结果 参考代码
php
<?php
$num1 = 10;
$num2 = 4;

echo "两个数:num1 = {$num1}, num2 = {$num2}<br>";
echo "加法:{$num1} + {$num2} = " . ($num1 + $num2) . "<br>";
echo "减法:{$num1} - {$num2} = " . ($num1 - $num2) . "<br>";
echo "乘法:{$num1} * {$num2} = " . ($num1 * $num2) . "<br>";
echo "除法:{$num1} / {$num2} = " . ($num1 / $num2) . "<br>";
echo "取模:{$num1} % {$num2} = " . ($num1 % $num2) . "<br>";
echo "幂运算:{$num1} ** {$num2} = " . ($num1 ** $num2) . "<br>";
?>

9.2 进阶练习

题目:使用比较运算符和逻辑运算符 解题思路:使用比较运算符比较值,使用逻辑运算符组合条件 常见误区===== 混用,逻辑运算符优先级错误 分步提示

  1. 创建一个名为 practice2.php 的文件
  2. 定义几个变量
  3. 使用比较运算符比较值
  4. 使用逻辑运算符组合条件
  5. 输出结果
  6. 运行文件查看结果 参考代码
php
<?php
$a = 10;
$b = "10";
$c = 5;
$d = true;
$e = false;

echo "比较运算:<br>";
echo "a == b: " . ($a == $b) . "<br>";
echo "a === b: " . ($a === $b) . "<br>";
echo "a > c: " . ($a > $c) . "<br>";
echo "a <= c: " . ($a <= $c) . "<br>";

echo "<br>逻辑运算:<br>";
echo "d && e: " . ($d && $e) . "<br>";
echo "d || e: " . ($d || $e) . "<br>";
echo "!d: " . !$d . "<br>";
echo "d xor e: " . ($d xor $e) . "<br>";

echo "<br>组合条件:<br>";
$age = 18;
$hasID = true;
$canVote = $age >= 18 && $hasID;
echo "是否可以投票:" . ($canVote ? "是" : "否") . "<br>";

$score = 85;
$grade = $score >= 90 ? "A" : ($score >= 80 ? "B" : ($score >= 70 ? "C" : "D"));
echo "成绩等级:" . $grade . "<br>";
?>

9.3 挑战练习

题目:创建一个简单的计算器 解题思路:使用各种运算符实现基本的计算功能 常见误区:运算符优先级错误,输入验证不足 分步提示

  1. 创建一个名为 practice3.php 的文件
  2. 定义两个操作数和一个运算符
  3. 根据运算符执行相应的计算
  4. 处理错误情况
  5. 输出计算结果
  6. 运行文件查看结果 参考代码
php
<?php
/**
 * 简单计算器
 */
class Calculator {
    /**
     * 执行计算
     * @param float $num1 第一个操作数
     * @param float $num2 第二个操作数
     * @param string $operator 运算符
     * @return float|string 计算结果或错误信息
     */
    public static function calculate($num1, $num2, $operator) {
        switch ($operator) {
            case '+':
                return $num1 + $num2;
            case '-':
                return $num1 - $num2;
            case '*':
                return $num1 * $num2;
            case '/':
                if ($num2 == 0) {
                    return "错误:除数不能为零";
                }
                return $num1 / $num2;
            case '%':
                if ($num2 == 0) {
                    return "错误:除数不能为零";
                }
                return $num1 % $num2;
            case '**':
                return $num1 ** $num2;
            default:
                return "错误:不支持的运算符";
        }
    }
}

// 测试计算器
$testCases = [
    [10, 5, '+'],
    [10, 5, '-'],
    [10, 5, '*'],
    [10, 5, '/'],
    [10, 0, '/'],
    [10, 3, '%'],
    [2, 3, '**'],
    [5, 2, '^']
];

echo "计算器测试:<br>";
foreach ($testCases as $case) {
    list($num1, $num2, $operator) = $case;
    $result = Calculator::calculate($num1, $num2, $operator);
    echo "{$num1} {$operator} {$num2} = {$result}<br>";
}
?>

10. 知识点总结

10.1 核心要点

  • PHP 支持多种类型的运算符:算术运算符、比较运算符、逻辑运算符、赋值运算符等
  • 运算符具有不同的优先级和结合性,决定了运算的执行顺序
  • ===== 的区别:== 只比较值,=== 同时比较值和类型
  • 逻辑运算符具有短路求值特性
  • 自增和自减运算符有前缀和后缀两种形式,行为不同
  • PHP 7+ 引入了空合并运算符 ??,用于处理 null 值

10.2 易错点回顾

  • 运算符优先级错误,导致计算结果不符合预期
  • ===== 混用,导致类型转换错误
  • 除法运算中的除数为零错误
  • 逻辑运算符的短路求值导致的副作用
  • 字符串比较时的字典序问题

11. 拓展参考资料

11.1 官方文档链接

11.2 进阶学习路径建议

  • 学习 PHP 流程控制语句
  • 学习 PHP 函数
  • 学习 PHP 面向对象编程
  • 学习 PHP 数组操作