文档没有详细解释 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 vs "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'));
按预期工作。