在 PHP 中,可以通过两种方式声明常量:
-
With define
keyword
define('FOO', 1);
-
Using const
keyword
const FOO = 1;
- 这两者之间的主要区别是什么?
- 何时以及为何应使用其中一种,何时使用另一种?
从 PHP 5.3 开始,有两种方法定义常量 http://php.net/language.constants.syntax: 要么使用const
关键字或使用define() http://php.net/define功能:
const FOO = 'BAR';
define('FOO', 'BAR');
这两种方式的根本区别在于const
在编译时定义常量,而define
在运行时定义它们。这导致大多数const
的缺点。的一些缺点const
are:
-
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 开始不推荐定义不区分大小写的常量,并从 PHP 8.0.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
也可以在类或接口中使用来定义类常数 http://php.net/manual/en/language.oop5.constants.php或界面常数。define
不能用于此目的:
class Foo {
const BAR = 2; // Valid
}
// But
class Baz {
define('QUX', 2); // Invalid
}
Summary
除非您需要任何类型的条件或表达式定义,否则请使用const
s 而不是define()
s - 只是为了可读性!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)