文件沒有詳細解釋在 PHP 中宣告常數的兩種方式之間的關鍵差異。
Const 在編譯時處理,define() 在執行時處理。因此,例如,不能使用 Const 有條件地定義常數。
我們可以注意到的另一個差異發生在類別中的常數宣告。 Const 滲透到類別範圍,而 define() 洩漏到全域範圍。
<?php
Class Myclass (){
const NAME = "Nicolas";
}
?>
NAME 常數在 MyClass 類別的範圍內。
常數可以使用 const
關鍵字或 define() 函式來定義。 define() 允許將常數定義為任意運算式,而 const
關鍵字則有一些限制,如下段所述。一旦定義了常數,就永遠不能更改或取消定義。
使用 const
關鍵字時,只接受純量(bool、int、float 和 string)表達式以及僅包含純量表達式的常數 陣列。可以將常數定義為 資源,但不建議這樣做,因為它可能導致非預期的結果。
常數的值可以透過指定其名稱來存取。與變數不同,常數的前面 *不* 加 $
符號。如果常數的名稱是動態取得的,也可以使用 constant() 函式來讀取常數的值。使用 get_defined_constants() 可以取得所有已定義常數的列表。
注意:常數和(全域)變數位於不同的命名空間。這意味著,例如
true
和 $TRUE 通常是不同的。
如果使用了未定義的常數,會拋出 Error。在 PHP 8.0.0 之前,未定義的常數會被解釋為裸字 字串,例如 (CONSTANT vs "CONSTANT")。這種回退機制自 PHP 7.2.0 起已被棄用,並且在發生這種情況時會發出級別為 E_WARNING
的錯誤。在 PHP 7.2.0 之前,發出的錯誤級別為 E_NOTICE。另請參閱手冊中關於為什麼 $foo[bar] 是錯誤的(除非 bar
是一個常數)的說明。這不適用於 (完全)限定常數,如果未定義,它們將始終引發 Error。
注意:要檢查常數是否已設定,請使用 defined() 函式。
以下是常數和變數之間的差異:
$
);
範例 #1 定義常數
<?php
define("CONSTANT", "Hello world.");
echo CONSTANT; // 輸出 "Hello world."
echo Constant; // 產生錯誤:未定義的常數 "Constant"
// 在 PHP 8.0.0 之前,輸出 "Constant" 並發出警告。
?>
範例 #2 使用 const
關鍵字定義常數
<?php
// 簡單的純量值
const CONSTANT = 'Hello World';
echo CONSTANT;
// 純量運算式
const ANOTHER_CONST = CONSTANT.'; Goodbye World';
echo ANOTHER_CONST;
const ANIMALS = array('dog', 'cat', 'bird');
echo ANIMALS[1]; // 輸出 "cat"
// 常數陣列
define('ANIMALS', array(
'dog',
'cat',
'bird'
));
echo ANIMALS[1]; // 輸出 "cat"
?>
注意事項:
與使用 define() 定義常數不同,使用
const
關鍵字定義的常數必須在最上層範圍宣告,因為它們是在編譯時定義的。這表示它們不能在函式、迴圈、if
陳述式或try
/catch
區塊內宣告。
文件沒有詳細解釋在 PHP 中宣告常數的兩種方式之間的關鍵差異。
Const 在編譯時處理,define() 在執行時處理。因此,例如,不能使用 Const 有條件地定義常數。
我們可以注意到的另一個差異發生在類別中的常數宣告。 Const 滲透到類別範圍,而 define() 洩漏到全域範圍。
<?php
Class Myclass (){
const NAME = "Nicolas";
}
?>
NAME 常數在 MyClass 類別的範圍內。
快速說明
從 PHP7 開始,您甚至可以將多維陣列定義為常數
define('QUARTLIST',array('1. Quarter'=>array('jan','feb','mar'),'2.Quarter'=>array('may','jun','jul'));
可以按預期工作。