2.6. define() vs. const
除非是影响到可读性与性能,或者用在类常量上,否则都优先使用define()。
在PHP中,习惯是使用 define() 函数定义常量。但在某种程度上,PHP 已经支持使用 const 关键字来声明常量。那定义常量时应该选择哪一个呢?
答案在于这两种方法之间的细微差别。
define()
在运行时定义常量,而const
在编译时定义常量。这给了const
一个细微的性能优势,但这不值得担心,除非你在开发特别大型的软件。- 尽管可以在常量名称中包含名称空间,但实际上
define()
将常量放在全局范围。这意味着你不能使用define()
来定义类常量。 define()
允许你在常量名称和常量值中使用表达式,而const
不允许任何表达式。这使得define()
更加灵活。define()
可以在if()
代码块内调用,而const
不能。
<?php
// 让我们看看这两个方法是如何处理命名空间的
namespace MiddleEarthCreatures\Dwarves;
const GIMLI_ID = 1;
define('MiddleEarth\Creatures\Elves\LEGOLAS_ID', 2);
print(\MiddleEarth\Creatures\Dwarves\GIMLI_ID); // 1
print(\MiddleEarth\Creatures\Elves\LEGOLAS_ID); // 2; 请注意,我们使用了define(),但命名空间仍然可以识别
// 现在,让我们声明一些位常量,表示进入 "魔多" 的方式。
define('TRANSPORT_METHOD_SNEAKING', 1 << 0); // OK!
const TRANSPORT_METHOD_WALKING = 1 << 1; // 编译错误!常量值不能使用表达式
// 接下来是条件常量。
define('HOBBITS_FRODO_ID', 1);
if($isGoingToMordor){
define('TRANSPORT_METHOD', TRANSPORT_METHOD_SNEAKING); // OK!
const PARTY_LEADER_ID = HOBBITS_FRODO_ID // 编译错误:const 不能在 if 代码块中使用
}
// 最后是类常量
class OneRing{
const MELTING_POINT_CELSIUS = 1000000; // OK!
define('MELTING_POINT_ELVISH_DEGREES', 200); // 编译错误:不能在类中使用define()
}
因为 define()
在各方面都更灵活,所以除非确实需要类常量,否则应该使用它来减少麻烦。使用 const
的代码阅读性会更好些,但同时也牺牲了灵活性。
不管你用哪一个,都要始终如一!
延伸阅读
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。