鍍金池/ 教程/ PHP/ define() vs. const
驗證郵件地址
自動加載類
PHP 與 MySQL
緩存 PHP opcode
檢測一個值是否為 null 或 false
PHP 標簽
從性能角度來看單引號和雙引號
發(fā)送郵件
處理日期和時間
define() vs. const
配置 Web 服務(wù)器提供 PHP 服務(wù)
PHP 與 UTF-8
我們在使用哪個版本的 PHP?
凈化 HTML 輸入和輸出
PHP 與正則表達式
存儲密碼
PHP 與 Memcached

define() vs. const

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

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

答案在于這兩種方法之間的區(qū)別。

  1. define() 在執(zhí)行期定義常量,而 const 在編譯期定義常量。這樣 const 就有輕微的速度優(yōu)勢, 但不值得考慮這個問題,除非你在構(gòu)建大規(guī)模的軟件。

  2. define() 將常量放入全局作用域,雖然你可以在常量名中包含命名空間。 這意味著你不能使用 define() 定義類常量。

  3. define() 允許你在常量名和常量值中使用表達式,而 const 則都不允許。 這使得 define() 更加靈活。

  4. define() 可以在 if() 代碼塊中調(diào)用,但 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); // 編譯錯誤: 在類內(nèi)不能使用 define()
}
?>

小插曲:當我看到第一行的 MiddleEarth 還沒有感覺到什么,再往下看到 Mordor 時,震驚了。OneRingOneRing,OneRingggggg!

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

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

進一步閱讀

上一篇:驗證郵件地址下一篇:自動加載類