该文档并没有详细解释 PHP 中声明常量的两种方式之间的关键区别。
Const 在编译时处理,define() 在运行时处理。因此,例如,常量不能使用 Const 条件定义。
我们可以注意到另一个区别发生在类中的常量声明中。Const 渗透到类作用域,而 define() 泄漏到全局作用域。
<?php
Class Myclass (){
const NAME = "Nicolas";
}
?>
NAME 常量在 MyClass 类作用域内。
可以使用 const
关键字或使用 define() 函数来定义常量。虽然 define() 允许将常量定义为任意表达式,但 const
关键字存在如下段落中概述的限制。一旦定义了常量,就不能再更改或取消定义。
使用 const
关键字时,只接受标量 (bool、int、float 和 string) 表达式和仅包含标量表达式的常量 array。可以将常量定义为 resource,但应避免这样做,因为它会导致意外结果。
只需指定常量名称即可访问常量的值。与变量不同,常量不以 $
为前缀。如果常量名称是动态获取的,也可以使用 constant() 函数读取常量的值。使用 get_defined_constants() 获取所有已定义常量的列表。
注意: 常量和 (全局) 变量位于不同的命名空间。这意味着例如
true
和 $TRUE 通常是不同的。
如果使用未定义的常量,将抛出 Error。在 PHP 8.0.0 之前,未定义的常量将被解释为一个裸词 string,即 (CONSTANT 与 "CONSTANT")。这种回退自 PHP 7.2.0 起已弃用,并且在发生这种情况时会发出级别为 E_WARNING
的错误。在 PHP 7.2.0 之前,已发出级别为 E_NOTICE 的错误。另请参阅手册条目,了解为什么 $foo[bar] 是错误的(除非 bar
是一个常量)。这并不适用于 (完全) 限定的常量,如果未定义,它们将始终引发 Error。
注意: 要检查是否设置了常量,请使用 defined() 函数。
以下列出了常量和变量之间的区别
$
);
示例 #1 定义常量
<?php
define("CONSTANT", "Hello world.");
echo CONSTANT; // 输出 "Hello world."
echo Constant; // 发出错误:未定义的常量 "Constant"
// 在 PHP 8.0.0 之前,输出 "Constant" 并发出警告。
?>
示例 #2 使用 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
块中声明。
该文档并没有详细解释 PHP 中声明常量的两种方式之间的关键区别。
Const 在编译时处理,define() 在运行时处理。因此,例如,常量不能使用 Const 条件定义。
我们可以注意到另一个区别发生在类中的常量声明中。Const 渗透到类作用域,而 define() 泄漏到全局作用域。
<?php
Class Myclass (){
const NAME = "Nicolas";
}
?>
NAME 常量在 MyClass 类作用域内。
只是一个简短的说明
从 PHP7 开始,你甚至可以将多维数组定义为常量
define('QUARTLIST',array('1. Quarter'=>array('jan','feb','mar'),'2.Quarter'=>array('may','jun','jul'));
按预期工作。