PHP 常量

预计阅读时间1 分 148 views

语法

在 PHP 编程中,常量用于存储不会改变的值。它们提供了在整个脚本中共享不变数据的方式。定义常量可以通过 const 关键字或 define() 函数实现,两者各有特点及适用场景。

使用 const 关键字定义常量

  • 适用类型:仅限于基本数据类型(布尔型(bool)、整型(int)、浮点型(float)、字符串(string))及数组(array)。
  • 特点:定义时需位于文件或命名空间的最顶级作用域,不能在条件语句、循环或函数内部定义。
  • 优势:编译时定义,可能带来轻微的性能提升。
  • 示例
  const MY_CONSTANT = 'Example Value';

使用 define() 函数定义常量

  • 适用范围:更广泛,包括基本数据类型、数组甚至表达式。
  • 灵活性:可以在运行时定义,适用于动态生成的常量名或值。
  • 示例
  define('MY_DEFINE', 'Another Example');

常量的使用规则

  • 访问方式:直接通过常量名引用,无需前置 $ 符号。
  • 动态名称访问:若需根据变量来引用常量名,应使用 constant() 函数。
  • 获取常量列表:使用 get_defined_constants() 函数可列出所有已定义的常量。
  • 作用域:常量在全局作用域中定义,不受变量作用域限制。
  • 不可变性:一旦定义,常量的值不能被更改或撤销定义。

注意事项

  • 命名空间差异:常量与全局变量分属不同命名空间,即使名称相同也不冲突,如 true 不等于 $TRUE
  • 未定义常量处理:尝试使用未定义的常量会触发错误。在 PHP 8.0.0 以前,这种行为会导致 PHP 尝试将其作为字符串解析,但这一特性已被废弃,并在 PHP 7.2.0 起开始警告,最终在 PHP 8 引入错误抛出。
  • 检查常量定义:使用 defined() 函数验证常量是否已被定义,是最佳实践。

示例代码

示例 #1:使用 define() 定义并使用常量

<?php
define("GREETING", "Hello world.");
echo GREETING; // 输出 "Hello world."
// 注意大小写敏感性,以下会抛出错误
// echo GREETING; 

示例 #2:使用 const 关键字定义常量

<?php
const GREET_MSG = 'Hello World';
echo GREET_MSG;

const ANOTHER_MSG = GREET_MSG . '; Goodbye World';
echo ANOTHER_MSG;

const PETS = ['dog', 'cat', 'bird'];
echo PETS[1]; // 输出 "cat"

// 或使用 define() 定义数组常量
define('PETS_DEFINE', ['dog', 'cat', 'bird']);
echo PETS_DEFINE[1]; // 同样输出 "cat"

预定义常量

PHP 提供了大量的预定义常量给运行中的脚本使用。这些常量可以在 PHP 官方手册的预定义常量页面找到。

预定义常量的来源

预定义常量有很多是由不同的扩展库定义的。只有在加载了这些扩展库时,这些常量才会生效。这些扩展库可以通过以下两种方式加载:

  1. 动态加载:通过配置文件或运行时加载扩展库。
  2. 编译时加载:在编译 PHP 时将扩展库包括进去。

以下是一些常见的 PHP 预定义常量:

  • PHP_VERSION:当前运行的 PHP 版本,例如 “8.0.3”。
  • PHP_OS:PHP 运行的操作系统,例如 “Linux”。
  • E_ERROR:表示错误级别的常量,值为 1

如果使用了特定的扩展库,还会有一些由扩展库定义的常量。例如,使用 mysqli 扩展库时,会有如下常量:

  • MYSQLI_ASSOC:用于指定 mysqli_fetch_array() 函数的返回结果为关联数组。
  • MYSQLI_NUM:用于指定 mysqli_fetch_array() 函数的返回结果为数字数组。

扩展库的加载方式

  1. 动态加载
    可以在 php.ini 文件中添加扩展库。例如:
   extension=mysqli
  1. 编译时加载
    在编译 PHP 时添加扩展库。例如:
   ./configure --with-mysqli

魔术常量

PHP 魔术常量是指那些在代码执行时其值会根据它们所在位置动态变化的常量。这些常量一共有九个,并且不区分大小写:

名称说明
__LINE__当前文件中的行号。
__FILE__当前文件的完整路径和文件名。如果在包含文件中使用,则返回被包含文件的路径和文件名。
__DIR__当前文件所在的目录。如果在包含文件中使用,则返回被包含文件所在的目录。相当于 dirname(__FILE__)。除非是根目录,否则目录名不包括末尾的斜杠。
__FUNCTION__当前函数的名称。如果在匿名函数中使用,则返回 {closure}
__CLASS__当前类的名称,包含命名空间(例如 Foo\Bar)。如果在 trait 方法中使用,__CLASS__ 返回调用该 trait 方法的类的名称。
__TRAIT__当前 trait 的名称,包含命名空间(例如 Foo\Bar)。
__METHOD__当前类的方法名。
__NAMESPACE__当前命名空间的名称。
ClassName::class完整的类名。
啰说教程

这些魔术常量在调试和记录日志时非常有用,因为它们可以提供精确的代码位置和上下文信息。例如,使用 __LINE__ 可以知道代码运行到哪一行,使用 __FILE__ 可以知道代码来自哪个文件。

分享此文档

PHP 常量

或复制链接

本页目录