常量是一个简单值的标识符(名字)。如同其名称所暗示的,在脚本执行期间该值不能改变(除了所谓的 魔术常量,它们其实不是常量)。常量大小写敏感。传统上常量标识符总是大写的。在 PHP 8.0.0 之前,使用 define() 定义的常量可能不区分大小写。
常量名和其它任何 PHP 标签遵循同样的命名规则。合法的常量名以字母或下划线开始,后面跟着任何字母,数字或下划线。用正则表达式是这样表达的: ^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$。还可以使用 define() 函数来定义包含保留字或非常规名称的常量,这类常量可以通过 constant() 函数来获取名称,但是不推荐这种用法。
示例:合法与非法的常量名
<?php // 合法的常量名 define("FOO", "something"); define("FOO2", "something else"); define("FOO_BAR", "something more"); // 非法的常量名 define("2FOO", "something"); // 下面的定义是合法的,但应该避免这样做:(自定义常量不要以__开头) // 也许将来有一天 PHP 会定义一个 __FOO__ 的魔术常量 // 这样就会与你的代码相冲突 define("__FOO__", "something"); ?>
注意: 这里的字母指的是 a-z,A-Z,以及从 128 到 255(0x80-0xff)的 ASCII 字符。
一、语法
一般情况下可以使用 const 关键字或 define() 函数两种方法来定义一个常量。函数 define() 允许将常量定义为一个表达式,而 const 关键字有一些限制。一个常量一旦被定义,就不能再改变或者取消定义;使用 const 关键字定义常量时,只能包含标量数据(bool、int、float 、string),可以将常量定义为一个表达式,也可以定义为一个 array,还可以定义 resource 为常量,但可能会造成不可预料的结果,所以尽量避免这个做法。
还可以通过直接指定常量名称来获取其值,与变量不同,不需要在常量名称前面加上 $ 符号。如果常量的名称是动态的,还可以使用 constant() 函数来获取常量的值。同时,使用 get_defined_constants() 函数可以获取所有已定义的常量列表。
注意:常量和(全局)变量在不同的名字空间中,例如 true 和 $TRUE 是不同的。
如果使用了一个未定义的常量,则会抛出 Error。 在 PHP 8.0.0 之前,调用未定义的常量会被解释为一个该常量的字符串,即(CONSTANT 对应 “CONSTANT” )。 此方法已在 PHP 7.2.0 中被废弃,会抛出一个 E_WARNING 级错误。(PHP 7.2.0 之前会发出一个 E_NOTICE 级的错误。)这不适用于 (完全)限定的常量,如果未定义,将始终引发 Error 。
注意:如果要检查是否定义了某常量,请使用 defined() 函数。
常量和变量有如下不同:
- 常量前面没有美元符号($);
- 常量可以不用理会变量的作用域而在任何地方定义和访问;
- 常量一旦定义就不能被重新定义或者取消定义;
- 常量只能计算标量值或数组。
示例 :定义常量
<?php define("CONSTANT", "Hello world."); echo CONSTANT; // 输出 "Hello world." echo Constant; // 抛出错误:未定义的常量 "Constant" // 在 PHP 8.0.0 之前,输出 "Constant" 并发出一个提示级别错误信息 ?>
示例 :使用关键字 const 定义常量
<?php // 简单的标量值 const CONSTANT = 'Hello World'; echo CONSTANT; // 标量表达式 const ANOTHER_CONST = CONSTANT.'; Goodbye World'; echo ANOTHER_CONST; const ANIMALS = array('dog', 'cat', 'bird'); echo ANIMALS[1]; // 将输出 "cat" // 常量数组 define('ANIMALS', array( 'dog', 'cat', 'bird' )); echo ANIMALS[1]; // 将输出 "cat" ?> ?>
注意:和使用 define() 来定义常量相反的是,使用 const 关键字定义常量必须处于最顶端的作用域,因为用此方法是在编译时定义的。这就代表着不能在函数内,循环内以及 if 或 try/catch 语句之内用 const 来定义常量。
二、预定义常量
PHP 向它运行的任何脚本提供了大量的预定义常量,不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。
三、魔术常量
有九个魔术常量它们的值随着它们在代码中的位置改变而改变。例如 __LINE__ 的值就依赖于它在脚本中所处的行来决定。这些特殊的常量不区分大小写,如下:
PHP 的魔术常量