使用 define(),除非考慮到可讀性、類常量、或關(guān)注微優(yōu)化
習(xí)慣上,在 PHP 中是使用 define() 函數(shù)來定義常量。 但從某個(gè)時(shí)候開始,PHP 中也能夠使用 const 關(guān)鍵字來聲明常量了。 那么當(dāng)定義常量時(shí),該使用哪種方式呢?
答案在于這兩種方法之間的區(qū)別。
define() 在執(zhí)行期定義常量,而 const 在編譯期定義常量。這樣 const 就有輕微的速度優(yōu)勢(shì), 但不值得考慮這個(gè)問題,除非你在構(gòu)建大規(guī)模的軟件。
define() 將常量放入全局作用域,雖然你可以在常量名中包含命名空間。 這意味著你不能使用 define() 定義類常量。
define() 允許你在常量名和常量值中使用表達(dá)式,而 const 則都不允許。 這使得 define() 更加靈活。
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 // 編譯錯(cuò)誤: const 不能用于 if 塊中 } // 最后, 類常量 class OneRing{ const MELTING_POINT_DEGREES = 1000000; // OK! define('SHOW_ELVISH_DEGREES', 200); // 編譯錯(cuò)誤: 在類內(nèi)不能使用 define() } ?>
小插曲:當(dāng)我看到第一行的 MiddleEarth 還沒有感覺到什么,再往下看到 Mordor 時(shí),震驚了。OneRing
,OneRing
,OneRingggggg!
因?yàn)?define() 更加靈活,你應(yīng)該使用它以避免一些令人頭疼的事情,除非你明確地需要類常量。 使用 const 通常會(huì)產(chǎn)生更加可讀的代碼,但是以犧牲靈活性為代價(jià)的。
無論你選擇哪一種,請(qǐng)保持一致。