本文摘譯整理自PHP最佳編程實踐——PHP中define() VS const
使用 define(),除非考慮到可讀性、類常量、或關注微優化
習慣上,在 PHP 中是使用 define() 函數來定義常量。 但從某個時候開始,PHP 中也能夠使用 const 關鍵字來聲明常量了。 那麽當定義常量時,該使用哪種方式呢?
答案在於這兩種方法之間的區別。
- define() 在執行期定義常量,而 const 在編譯期定義常量。這樣 const 就有輕微的速度優勢, 但不值得考慮這個問題,除非你在構建大規模的軟件。
- define() 將常量放入全局作用域,雖然你可以在常量名中包含命名空間。 這意味著你不能使用 define() 定義類常量。
- define() 允許你在常量名和常量值中使用表達式,而 const 則都不允許。 這使得 define() 更加靈活。
- 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()
}
?>
因為 define() 更加靈活,你應該使用它以避免一些令人頭疼的事情,除非你明確地需要類常量。 使用 const 通常會產生更加可讀的代碼,但是以犧牲靈活性為代價的。
無論你選擇哪一種,請保持一致。
進一步閱讀