當前位置: 首頁>>編程語言>>正文


PHP中的define和const比較

本文摘譯整理自PHP最佳編程實踐——PHP中define() VS const

使用 define(),除非考慮到可讀性、類常量、或關注微優化

習慣上,在 PHP 中是使用 define() 函數來定義常量。 但從某個時候開始,PHP 中也能夠使用 const 關鍵字來聲明常量了。 那麽當定義常量時,該使用哪種方式呢?

答案在於這兩種方法之間的區別。

  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()
}
?>

因為 define() 更加靈活,你應該使用它以避免一些令人頭疼的事情,除非你明確地需要類常量。 使用 const 通常會產生更加可讀的代碼,但是以犧牲靈活性為代價的。

無論你選擇哪一種,請保持一致。

進一步閱讀

本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/1719.html,未經允許,請勿轉載。