## 使用?[define()](http://www.php.net/manual/en/function.define.php),除非考慮到可讀性、類常量、或關注微優化
習慣上,在 PHP 中是使用 define() 函數來定義常量。 但從某個時候開始,PHP 中也能夠使用?[const](http://php.net/manual/zh/language.oop5.constants.php)?關鍵字來聲明常量了。 那么當定義常量時,該使用哪種方式呢?
答案在于這兩種方法之間的區別。
1. define() 在執行期定義常量,而 const 在編譯期定義常量。這樣 const 就有輕微的速度優勢, 但不值得考慮這個問題,除非你在構建大規模的軟件。
2. define() 將常量放入全局作用域,雖然你可以在常量名中包含命名空間。 這意味著你不能使用 define() 定義類常量。
3. define() 允許你在常量名和常量值中使用表達式,而 const 則都不允許。 這使得 define() 更加靈活。
4. define() 可以在 if() 代碼塊中調用,但 const 不行。
## 示例
~~~
<?php
// 來看看這兩種方法如何處理 namespaces
namespace MiddleEarth\Creatures\Dwarves;
const GIMLI_ID = 1;
define('MiddleEarth\Creatures\Elves\LEGOLAS_ID', 2);
echo(\MiddleEarth\Creatures\Dwarves\GIMLI_ID); // 1
echo(\MiddleEarth\Creatures\Elves\LEGOLAS_ID); // 2; 注意:我們使用了 define()
// Now let's declare some bit-shifted constants representing ways to enter Mordor.
define('TRANSPORT_METHOD_SNEAKING', 1 << 0); // OK!
const TRANSPORT_METHOD_WALKING = 1 << 1; //Compile error! const can't use expressions as values
// 接下來, 條件常量。
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_DEGREES = 1000000; // OK!
define('SHOW_ELVISH_DEGREES', 200); // 編譯錯誤: 在類內不能使用 define()
}
?>
~~~
> 小插曲:當我看到第一行的 MiddleEarth 還沒有感覺到什么,再往下看到 Mordor 時,震驚了。**OneRing**,**OneRing**,**OneRingggggg**!
因為 define() 更加靈活,你應該使用它以避免一些令人頭疼的事情,除非你明確地需要類常量。 使用 const 通常會產生更加可讀的代碼,但是以犧牲靈活性為代價的。
無論你選擇哪一種,請保持一致。
## 進一步閱讀
* [Stack Overflow: define() vs. const](http://stackoverflow.com/questions/2447791/define-vs-const)
* [PHP 手冊:常量](http://www.php.net/manual/en/language.constants.syntax.php)
* [Stack Overflow: define() vs. 變量](http://stackoverflow.com/questions/1225082/define-vs-variable-in-php)