Helenr
从PHP 5.3开始,有两种方法可以定义常量:使用const关键字或使用define()函数:const FOO = 'BAR';define('FOO', 'BAR');这两种方式之间的根本区别在于const在编译时定义常量,而define在运行时定义它们。这导致了大多数const的缺点。一些缺点const是:const不能用于有条件地定义常量。要定义全局常量,必须在最外层范围内使用它:if (...) {
const FOO = 'BAR'; // Invalid}// butif (...) {
define('FOO', 'BAR'); // Valid}你为什么要这样做呢?一个常见的应用是检查是否已定义常量:if (!defined('FOO')) {
define('FOO', 'BAR');}const接受一个静态标量(数字,字符串或其它恒定等true,false,null,__FILE__),而define()采取的任何表达式。由于PHP 5.6也允许使用常量表达式const:const BIT_5 = 1 << 5; // Valid since PHP 5.6 and invalid previouslydefine('BIT_5', 1 << 5); // Always validconst采用普通的常量名称,而define()接受任何表达式作为名称。这允许做这样的事情:for ($i = 0; $i < 32; ++$i) {
define('BIT_' . $i, 1 << $i);}consts始终区分大小写,而define()允许您通过传递true第三个参数来定义不区分大小写的常量:define('FOO', 'BAR', true);echo FOO; // BARecho foo; // BAR所以,这是事情的坏方面。现在让我们看一下我个人总是使用的原因,const除非出现上述情况之一:const只是阅读更好。它是一种语言结构而不是函数,也与您在类中定义常量的方式一致。const作为一种语言结构,可以通过自动化工具进行静态分析。const在当前命名空间中定义一个常量,同时define()必须传递完整的命名空间名称:namespace A\B\C;// To define the constant A\B\C\FOO:const FOO = 'BAR';define('A\B\C\FOO', 'BAR');由于PHP 5.6 const常量也可以是数组,define()而不支持数组。但是,PHP 7中的两种情况都支持数组。const FOO = [1, 2, 3]; // Valid in PHP 5.6define('FOO', [1, 2, 3]); // Invalid in PHP 5.6 and valid in PHP 7.0最后,请注意,const也可以在类或接口中使用它来定义类常量或接口常量。define不能用于此目的:class Foo {
const BAR = 2; // Valid}// Butclass Baz {
define('QUX', 2); // Invalid}摘要除非你需要任何类型的条件或表达定义,否则使用consts而不是define()s - 只是为了便于阅读!