PHP教程:常量
编辑文章常量用于定义程序运行中固定不变的值,以提升代码的可维护性和可靠性。例如,数据库配置、应用版本号或数学常量(如π)在脚本中不应被意外修改,使用常量可以确保这些值始终保持一致。
常量与变量的关键区别
- 主要有三点区别。常量使用
define()或const定义,而变量使用$声明。 - 常量的值不可改变,也无法被
unset()。 - 常量自动具有全局作用域,而变量有其明确的作用域规则。
语法示例
定义常量主要使用 define() 函数和 const 关键字。
// 使用 define() 函数
define('SITE_NAME', 'MySite');
define('PI', 3.14159);
// 使用 const 关键字(通常在全局或类作用域)
const MAX_USERS = 100;
const ENV = 'production';
define() 函数和 const 关键字
define() 是一个函数,可以在运行时的任何地方调用,包括条件语句内。const 是一个语言结构,必须在编译时定义,通常用在全局作用域或类定义中,不能在函数或条件块内直接使用。
if ($condition) {
define('STATUS', 'active'); // 允许
// const STATUS = 'active'; // 不允许,会产生语法错误
}
命名规则
常量标识符默认区分大小写,且传统上使用全大写字母和下划线命名。
访问常量时不需要美元符号($)。
define('API_KEY', 'secret123');
echo API_KEY; // 正确,输出:secret123
echo api_key; // 会产生警告(未定义的常量),并视作字符串‘api_key’
值类型与作用域
常量的值只能是标量(int、float、string、bool)或 null。自 PHP 8.1.0 起,也支持数组作为常量值。常量一旦定义,在全局作用域内均可访问,可以在函数或方法内部直接使用。
define('CONFIG', ['host' => 'localhost', 'port' => 3306]);
function connectDb() {
echo CONFIG['host']; // 输出:localhost
}
预定义常量与魔术常量
PHP 提供了丰富的预定义常量(如 PHP_VERSION)和魔术常量。魔术常量是一个特殊类别,它们的值会根据其在代码中的使用位置而自动变化。例如 __FILE__ 返回当前文件的完整路径,__LINE__ 返回其所在的行号,__FUNCTION__ 返回当前的函数名。
echo __FILE__; // 输出当前脚本的完整文件路径
function test() {
echo __FUNCTION__; // 输出:test
}
魔术常量表格
| 魔术常量 | 描述 | 返回值类型 | 典型使用场景 |
|---|---|---|---|
__LINE__ |
返回文件中当前行号 | int |
调试错误、日志记录 |
__FILE__ |
返回当前文件的完整路径和文件名 | string |
文件路径相关操作、调试 |
__DIR__ |
返回当前文件所在的目录(等价于 dirname(__FILE__)) |
string |
构造相对路径、包含文件 |
__FUNCTION__ |
返回当前函数名称 | string |
函数内部自省、调试 |
__CLASS__ |
返回当前类名称(包含命名空间) | string |
类内部自省、反射 |
__TRAIT__ |
返回当前 trait 名称(包含命名空间) |
string |
trait 内部自省 |
__METHOD__ |
返回当前方法名称(包含类名和方法名) | string |
方法内部自省、调试 |
__NAMESPACE__ |
返回当前命名空间名称 | string |
命名空间相关操作 |
ClassName::class |
返回类的完全限定名称(注意:此为特殊语法,非常量) | string |
自动加载、类型安全比较 |
说明:
– 所有魔术常量(除 ClassName::class)在编译时确定其值,值的大小写与代码中书写一致。
– ClassName::class 是一个类名解析语法,并非严格意义上的常量,但因其与魔术常量用途相似,通常一并讨论。