2.6. define() vs. const

未匹配的标注

除非是影响到可读性与性能,或者用在类常量上,否则都优先使用define()

在PHP中,习惯是使用 define() 函数定义常量。但在某种程度上,PHP 已经支持使用 const 关键字来声明常量。那定义常量时应该选择哪一个呢?

答案在于这两种方法之间的细微差别。

  1. define() 在运行时定义常量,而 const 在编译时定义常量。这给了 const 一个细微的性能优势,但这不值得担心,除非你在开发特别大型的软件。
  2. 尽管可以在常量名称中包含名称空间,但实际上 define() 将常量放在全局范围。这意味着你不能使用 define() 来定义类常量。
  3. define() 允许你在常量名称和常量值中使用表达式,而 const 不允许任何表达式。这使得 define() 更加灵活。
  4. 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 的代码阅读性会更好些,但同时也牺牲了灵活性。

不管你用哪一个,都要始终如一!

延伸阅读

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/phpbestpractice...

译文地址:https://learnku.com/docs/phpbestpractice...

上一篇 下一篇
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~