使用 define(),除非考慮到可讀性、類常量、或關注微優化
習慣上,在 PHP 中(zhōng)是使用 define() 函數來定義常量。 但從某個時候開(kāi)始,PHP 中(zhōng)也能夠使用 const 關鍵字來聲明常量了。 那麽當定義常量時,該使用哪種方式呢?
答案在于這兩種方法之間的區别。
define() 在執行期定義常量,而 const 在編譯期定義常量。這樣 const 就有輕微的速度優勢, 但不值得考慮這個問題,除非你在構建大(dà)規模的軟件。
define() 将常量放(fàng)入全局作用域,雖然你可以在常量名中(zhōng)包含命名空間。 這意味着你不能使用 define() 定義類常量。
define() 允許你在常量名和常量值中(zhōng)使用表達式,而 const 則都不允許。 這使得 define() 更加靈活。
define() 可以在 if() 代碼塊中(zhōng)調用,但 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; 注意:我(wǒ)們使用了 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 // 接下(xià)來, 條件常量。 define('HOBBITS_FRODO_ID', 1); if($isGoingToMordor){ define('TRANSPORT_METHOD', TRANSPORT_METHOD_SNEAKING); // OK! const PARTY_LEADER_ID = HOBBITS_FRODO_ID // 編譯錯誤: const 不能用于 if 塊中(zhōng) } // 最後, 類常量 class OneRing{ const MELTING_POINT_DEGREES = 1000000; // OK! define('SHOW_ELVISH_DEGREES', 200); // 編譯錯誤: 在類内不能使用 define() } ?>
小(xiǎo)插曲:當我(wǒ)看到第一(yī)行的 MiddleEarth 還沒有感覺到什麽,再往下(xià)看到 Mordor 時,震驚了。OneRing
,OneRing
,OneRingggggg!
因爲 define() 更加靈活,你應該使用它以避免一(yī)些令人頭疼的事情,除非你明确地需要類常量。 使用 const 通常會産生(shēng)更加可讀的代碼,但是以犧牲靈活性爲代價的。
無論你選擇哪一(yī)種,請保持一(yī)緻。