[PHP]常量定義: const和define區別和運用; 附constant解釋

Object發表於2019-02-16

前言

常量是一個簡單值的識別符號(名字)。如同其名稱所暗示的,在指令碼執行期間該值不能改變(除了所謂的魔術常量,它們其實不是常量)。常量預設為大小寫敏感。通常常量識別符號總是大寫的。

在 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不可用在條件判斷中,不過可定義在類中,不可表示式賦值,必須是標量

相關文章