常量与运算符
常量是程序中不可变的基石,运算符则是构建逻辑的积木。本页全面解析常量的两种定义方式、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. 比较运算符
比较两个值,总是返回布尔值 true 或 false。重点是区分 == 和 ===。
<?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();
在实际开发中,运算符的优先级很容易引起混淆(比如 || 和 = 混用)。最稳妥的做法是:多使用括号 () 显式地控制执行顺序,而不是死记硬背优先级表。