在PHP中,何时使用
define('FOO', 1);
以及何时使用
const FOO = 1;
?
两者之间的主要区别是什么?
从PHP
5.3开始,有两种定义常量的方法:使用const
关键字或使用define()
函数:
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
接受一个静态标量(数字,字符串或其它恒定等true
,false
,null
,__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);
}
const
s始终区分大小写,而define()
允许您通过将其true
作为第三个参数传递来定义不区分大小写的常量(注意:自PHP 7.3.0起不建议使用不区分大小写的常量。):
define('FOO', 'BAR', true);
echo FOO; // BAR
echo 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.6
define(‘FOO’, [1, 2, 3]); // Invalid in PHP 5.6 and valid in PHP 7.0
最后,请注意,const
还可以在类或接口内使用它来定义类常量或接口常量。define
不能用于此目的:
class Foo {
const BAR = 2; // Valid
}
// But
class Baz {
define('QUX', 2); // Invalid
}
摘要
除非您需要任何类型的条件或表达式定义,否则使用const
s代替define()
s-仅出于可读性考虑!
Create a new constructor function for a type inheriting from StringLikeSequence. Signature StringLikeSequence.define = function(methodName, overrides) { /*...*/ } StringLikeSequence.define = function
Create a new constructor function for a type inheriting from ObjectLikeSequence. Signature ObjectLikeSequence.define = function(methodName, overrides) { /*...*/ } ObjectLikeSequence.define = function
Create a new constructor function for a type inheriting from ArrayLikeSequence. Signature ArrayLikeSequence.define = function(methodName, overrides) { /*...*/ } ArrayLikeSequence.define = function def
Create a new constructor function for a type inheriting from Sequence. Signature Sequence.define = function(methodName, overrides) { /*...*/ } Sequence.define = function define(methodName, overrides)
使用 define(),除非考虑到可读性、类常量、或关注微优化 习惯上,在 PHP 中是使用 define() 函数来定义常量。 但从某个时候开始,PHP 中也能够使用 const 关键字来声明常量了。 那幺当定义常量时,该使用哪种方式呢? 答案在于这两种方法之间的区别。 define()在执行期定义常量,而const在编译期定义常量。这样const就有轻微的速度优势, 但不值得考虑这个问题,除非
请参考:http://www.kancloud.cn/manual/thinkphp/1816