在PHP中能夠經過define()和const兩種方式定義常量
但是在開發中咱們應該何時用define()定義常量,何時用const定義常量? 這兩種方式定義常量的主要區別是什麼?php
從5.3版本開始PHP有兩種方法來定義常量,使用const
關鍵字或者是使用define()
方法:數組
const FOO = 'BAR'; define('FOO', 'BAR');
二者之間最大的區別在於const
是在編譯時定義常量,而define()
方法是在運行時定義常量。ide
const
不能用在if語句中, defne()
能用在if語句中。函數
if(...) { const FOO = 'BAR';//錯誤 } if(...) { define('FOO', 'BAR');//正確 }
define()
的一個經常使用場景是先判斷常量是否已經定義再定義常量:spa
if(defined('FOO)) { define('FOO', 'BAR') }
const
定義常量時,值只能是靜態標量(數字, 字符串, true
,false
, null
), 而define()
方法能夠把任意表達式的值用做常量的值。從PHP5.6開始const
也容許把表達式用做常量的值了。.net
const BIT_5 = 1 << 5; //PHP5.6後支持,以前的PHP版本不支持 define('BIT_5', 1 << 5);// 全部PHP版本都支持
const
只容許簡單的常量名,而define()
能夠把任何表達式的值用做常量名code
for ($i = 0; $i < 32; $i++) { define('BIT_' . $i, 1 << $i); }
const
定義的常量常量名是大小寫敏感的,而傳遞true
給define()
方法的第三個參數時能夠定義大小寫不敏感的常量。接口
define('FOO', 'BAR', true); echo FOO; //BAR echo foo; //BAR
上面列舉的都是const
相較define()
而言的一些缺點或者不靈活的地方,下面咱們看一下爲何我我的推薦用const
而不是define()
來定義常量(除非要在上述列舉的場景中定義常量)。開發
const
具備更好的可讀性,const
是語言結構而不是函數,並且與在類中定義類常量的形式保持一致。字符串
const
在當前的命名空間中定義常量, 而define()
要實現相似效果必須在定義時傳遞完整的命名空間名稱:
namespace A\B\C; //To define the constant A\B\C\FOO: const FOO = 'BAR'; define('A\B\C\FOO', 'BAR');
const
從PHP5.6版本開始能夠把數組用做常量值,而define()
在PHP7.0版本開始才支持把數組用做常量值。
const FOO = [1, 2, 3];// valid in PHP 5.6 define('FOO', [1, 2, 3]);// invalid in PHP 5.6, valid in PHP 7.0
由於const
是語言結構而且在編譯時定義常量因此const
會比define()
稍稍快一些。
衆所周知PHP在用define()
定義了大量的常量後會影響效率。 人們設置發明了apc_load_constants()和hidef來繞過define()
致使的效率問題。
最後,const
還能被用於在類和接口中定義常量,define()
只能被用於在全局命名空間中定義常量:
class FOO { const BAR = 2;// 正確 } class Baz { define('QUX', 2)// 錯誤 }
總結:
除非要在if分支裏定義常量或者是經過表達式的值來命名常量, 其餘狀況(即便是隻是簡單的爲了代碼的可讀性)都推薦用const
替代define()
。