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’

值类型与作用域

常量的值只能是标量(intfloatstringbool)或 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 是一个类名解析语法,并非严格意义上的常量,但因其与魔术常量用途相似,通常一并讨论。