前言
常量是一個簡單值的識別符號(名字)。如同其名稱所暗示的,在指令碼執行期間該值不能改變(除了所謂的魔術常量,它們其實不是常量)。常量預設為大小寫敏感。通常常量識別符號總是大寫的。
在 PHP 5.3.0 之前可以用 define() 函式來定義常量。
在 PHP 5.3.0 以後,可以使用 const 關鍵字在類定義的外部定義常量,先前版本const 關鍵字只能在類(class)中使用。
一個常量一旦被定義,就不能再改變或者取消定義。
常量只能包含標量資料(boolean,integer,float 和 string),不能是表示式。
可以定義 resource 常量,但應儘量避免,因為會造成不可預料的結果。
可以簡單的通過指定其名字來取得常量的值,與變數不同,不應該在常量前面加上 $ 符號。
如果常量名是動態的,也可以用函式constant() 來獲取常量的值。
用get_defined_constants() 可以獲得所有已定義的常量列表。
常量和變數有如下不同:
常量前面沒有美元符號($);
常量可以不用理會變數的作用域而在任何地方定義和訪問;
常量一旦定義就不能被重新定義或者取消定義;
常量的值只能是標量。
const實驗
<?php
const CONST_A = `A`;
const CONST_B = `B`;
echo CONST_A;
echo "
--------
";
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 "
--------
";
echo CONST_B;
?>
輸出結果
Parse error: syntax error, unexpected `const` (T_CONST) in /usercode/file.php on line 5
<?php
class fooClass {
const bar = `pro`;
public function print(){
echo self::bar;
}
}
echo fooClass::bar;
$classname = "fooClass";
echo $classname::bar. "
"; // 自 5.3.0 起
$foo = new fooClass();
echo "
----
";
echo $foo->print();
echo "
----
";
echo $foo::bar; // 自 5.3.0 起
?>
輸出結果
pro
—-
pro
—-
pro
define實驗
<?php
define(`CONST_A`,`A`);
define(`CONST_B`,`B`);
define(`CONST_FOUR`, 1+3);
echo CONST_A;
echo "
--------
";
echo CONST_B;
echo "
--------
";
echo CONST_FOUR;
?>
輸出結果
A
—-
B
—-
4
<?php
define(`CONST_A`,`A`);
if(true){
define(`CONST_B`,`B`);
}
if(false){
define(`CONST_C`,`C`);
}
echo CONST_A;
echo "
--------
";
echo CONST_B;
echo "
--------
";
echo CONST_C;
?>
輸出結果
A
——–
B
——–
CONST_C
define不可以出現在類定義之中
附加constant函式
之前一直不理解constant有什麼作用,先看下官方的介紹
通過 name 返回常量的值。當你不知道常量名,卻需要獲取常量的值時,constant() 就很有用了。也就是常量名儲存在一個變數裡,或者由函式返回常量名。該函式也適用
下面用一個簡單的程式碼來實驗
<?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不可用在條件判斷中,不過可定義在類中,不可表示式賦值,必須是標量