常量是一個簡單值的標識符(名字)。如同其名稱所暗示的,在腳本執行期間該值不能改變(除了所謂的魔術常量,它們其實不是常量)。常量默認爲大小寫敏感。一般常量標識符老是大寫的。php
在 PHP 5.3.0 以前能夠用 define() 函數來定義常量。
在 PHP 5.3.0 之後,可使用 const 關鍵字在類定義的外部定義常量,先前版本const 關鍵字只能在類(class)中使用。
一個常量一旦被定義,就不能再改變或者取消定義。
常量只能包含標量數據(boolean,integer,float 和 string),不能是表達式。
能夠定義 resource 常量,但應儘可能避免,由於會形成不可預料的結果。函數
能夠簡單的經過指定其名字來取得常量的值,與變量不一樣,不該該在常量前面加上 $ 符號。
若是常量名是動態的,也能夠用函數constant() 來獲取常量的值。
用get_defined_constants() 能夠得到全部已定義的常量列表。
常量和變量有以下不一樣:
常量前面沒有美圓符號($);
常量能夠不用理會變量的做用域而在任何地方定義和訪問;
常量一旦定義就不能被從新定義或者取消定義;
常量的值只能是標量。code
<?php const CONST_A = 'A'; const CONST_B = 'B'; echo CONST_A; echo "\n--------\n"; echo CONST_B; ?>
A
----
B作用域
<?php const CONST_A = 'A'; if(true){ //這裏無論是什麼條件 const其實都不能夠在條件裏出現,沒法經過編譯解釋 const CONST_B = 'B'; } const CONST_FOUR = 1+2; //沒法經過編譯解釋,const必須是標量不能是表達式 echo CONST_A; echo "\n--------\n"; echo CONST_B; ?>
Parse error: syntax error, unexpected 'const' (T_CONST) in /usercode/file.php on line 5get
<?php class fooClass { const bar = 'pro'; public function print(){ echo self::bar; } } echo fooClass::bar; $classname = "fooClass"; echo $classname::bar. "\n"; // 自 5.3.0 起 $foo = new fooClass(); echo "\n----\n"; echo $foo->print(); echo "\n----\n"; echo $foo::bar; // 自 5.3.0 起 ?>
pro
----
pro
----
prostring
<?php define('CONST_A','A'); define('CONST_B','B'); define('CONST_FOUR', 1+3); echo CONST_A; echo "\n--------\n"; echo CONST_B; echo "\n--------\n"; echo CONST_FOUR; ?>
A
----
B
----
4io
<?php define('CONST_A','A'); if(true){ define('CONST_B','B'); } if(false){ define('CONST_C','C'); } echo CONST_A; echo "\n--------\n"; echo CONST_B; echo "\n--------\n"; echo CONST_C; ?>
A
--------
B
--------
CONST_C編譯
define不能夠出如今類定義之中function
以前一直不理解constant有什麼做用,先看下官方的介紹
經過 name 返回常量的值。當你不知道常量名,卻須要獲取常量的值時,constant() 就頗有用了。也就是常量名儲存在一個變量裏,或者由函數返回常量名。該函數也適用
下面用一個簡單的代碼來實驗class
<?php define("MAXSIZE", 100); echo MAXSIZE; //output: 100 echo constant("MAXSIZE"); //output: 100 interface bar { const test = 'foobar!'; } class foo { const test = 'foobar!'; } $const = 'test'; var_dump(constant('bar::'. $const)); //output: "foobar!" var_dump(constant('foo::'. $const)); //output: "foobar!" ?>
define可用在條件判斷中,不成立的條件中,定義的不生效,成功定義後全局可用,但是表達式賦值const不可用在條件判斷中,不過可定義在類中,不可表達式賦值,必須是標量