在PHP 5.3中有两种定义常量的方法:使用
const FOO = 'BAR';
define('FOO', 'BAR');
这两种方法的根本区别在于,const在编译时定义常量,而define在运行时定义它们。这导致了const的大部分缺点。const的一些缺点是:
缺点一
不能使用const来有条件地定义常量。要定义一个全局常量,它必须在最外面的作用域中使用:
if (...) {
const FOO = 'BAR'; // Invalid
}
// but
if (...) {
define('FOO', 'BAR'); // Valid
}
你为什么要这么做呢?一个常见的应用程序是检查常数是否已经定义:
if (!defined('FOO')) {
define('FOO', 'BAR');
}
缺点二
const接受静态标量(数字、字符串或其他常量,如真、假、空、剩余的file__),而define()接受任何表达式。因为PHP 5.6常量表达式在const中也是允许的:
const BIT_5 = 1 << 5; // Valid since PHP 5.6 and invalid previously
define('BIT_5', 1 << 5); // Always valid
缺点三
const接受普通常量名称,而define()接受任何表达式作为名称。这允许做这样的事情:
for ($i = 0; $i < 32; ++$i) {
define('BIT_' . $i, 1 << $i);
}
缺点四
consts总是区分大小写的,而define()允许你通过传递true作为第三个参数来定义不区分大小写的常量(注意:在PHP 7.3.0中定义不区分大小写的常量是不赞成的):
define('FOO', 'BAR', true);
echo FOO; // BAR
echo foo; // BAR
优点
这就是事情不好的一面。现在让我们看看什么情况下使用const:
const只是读得更好。它是一种语言构造,而不是函数,并且与在类中定义常量的方式一致。
const作为一种语言结构,可以通过自动化工具进行静态分析。
const在当前名称空间中定义一个常量,而define()必须传递完整的名称空间名称。
因为PHP 5.6 const常量也可以是数组,而define()还不支持数组。但是,在PHP 7中,这两种情况都支持数组。
最后,请注意,const还可以在类或接口中用于定义类常量或接口常量。define不能用于此目的:
class Foo {
const BAR = 2; // Valid
}
// But
class Baz {
define('QUX', 2); // Invalid
}
总结
除非您需要任何类型的条件定义或表达式定义,否则请使用consts而不是define()。
原创文章,作者:犀牛前端部落,如若转载,请注明出处:https://www.pipipi.net/4557.html