第5页 / 共40页

常量与运算符

常量是程序中不可变的基石,运算符则是构建逻辑的积木。本页全面解析常量的两种定义方式、PHP 特有的魔术常量,并详尽梳理算术、比较、逻辑及 PHP 8 专属的现代运算符。

一、常量的定义与使用

常量是一个简单值的标识符。如同其名,常量在脚本执行期间不能被修改或撤销。与变量不同,常量前面没有美元符号 $,且默认全局生效。

1. define() 函数定义

传统的定义方式,可以在运行时动态定义。通常用于全局配置常量。

<?php define("APP_NAME", "惜梦PHP系统"); define("MAX_USERS", 1000); echo APP_NAME; // 输出:惜梦PHP系统

2. const 关键字定义

在编译时确定,速度略快。通常用于类中定义属性常量,或在顶层代码中定义常量。

<?php const VERSION = "8.0"; const IS_DEBUG = true; echo VERSION; // 输出:8.0

区别总结define() 可以在条件语句或函数内部使用,而 const 必须在顶层作用域或类中使用。const 只能定义标量类型(int, float, string, bool),而 define() 在 PHP 7+ 后支持数组。

二、PHP 的魔术常量

PHP 提供了一组特殊的常量,它们的值会随着它们在代码中的位置而改变,被称为"魔术常量"。

__LINE__ 文件中的当前行号
__FILE__ 文件的完整绝对路径和文件名
__DIR__ 文件所在的目录绝对路径
__FUNCTION__ 当前被定义的函数名称
__CLASS__ 当前被定义的类名称
__METHOD__ 当前类的方法名称
<?php echo "当前文件路径:" . __FILE__; echo "当前所在行号:" . __LINE__;

三、算术与赋值运算符

1. 算术运算符

用于执行基本的数学运算。

<?php $a = 10; $b = 3; echo $a + $b; // 加法:13 echo $a - $b; // 减法:7 echo $a * $b; // 乘法:30 echo $a / $b; // 除法:3.333... echo $a % $b; // 取模(余数):1 echo $a ** $b; // 幂运算 (PHP 5.6+):1000

2. 赋值运算符

除了基本的 = 赋值外,PHP 提供了简写的复合赋值运算符。

<?php $x = 10; $x += 5; // 等同于 $x = $x + 5; 结果 15 $x -= 3; // 结果 12 $x *= 2; // 结果 24 $str = "惜梦"; $str .= "PHP"; // 字符串拼接赋值,结果 "惜梦PHP"

四、比较与逻辑运算符

1. 比较运算符

比较两个值,总是返回布尔值 truefalse。重点是区分 =====

<?php $v1 = 0; $v2 = "0"; var_dump($v1 == $v2); // true。因为弱类型比较,0 等于 "0" var_dump($v1 === $v2); // false。因为严格比较,类型不同 (int vs string) // 太空船操作符 (PHP 7+) // 左边小于右边返回 -1,等于返回 0,大于返回 1 echo 5 <=> 10; // 输出 -1

2. 逻辑运算符

用于组合条件的判断,常用于 if 语句中。

&& 或 and逻辑与:两边都为 true 才是 true
|| 或 or逻辑或:任一边为 true 即是 true
!逻辑非:取反,true 变 false
xor逻辑异或:两边不同时为 true 才是 true

五、PHP 特有与现代运算符

1. 字符串连接符 (.)

在 PHP 中,拼接字符串使用点 . 而不是加号 +。如果用 + 拼接字符串,PHP 会尝试将字符串转为数字进行数学加法。

<?php $a = "Hello"; $b = "PHP"; echo $a . " " . $b; // 输出:Hello PHP

2. Null 合并运算符 (??)

PHP 7 引入。用于简化判断变量是否存在的代码。如果左侧存在且不为 NULL,就返回左侧;否则返回右侧。

<?php // 传统写法 $username = isset($_GET['user']) ? $_GET['user'] : 'Guest'; // PHP 7+ 写法 $username = $_GET['user'] ?? 'Guest';

3. Nullsafe 运算符 (?->)

PHP 8.0 引入。在链式调用对象方法时,如果前面的对象为 null,不会报错,而是直接返回 null。

<?php // PHP 7 写法:需要层层 if 判断 $country = null; if ($user !== null) { $profile = $user->getProfile(); if ($profile !== null) { $country = $profile->getCountry(); } } // PHP 8 写法:一行搞定 $country = $user?->getProfile()?->getCountry();

在实际开发中,运算符的优先级很容易引起混淆(比如 ||= 混用)。最稳妥的做法是:多使用括号 () 显式地控制执行顺序,而不是死记硬背优先级表。