引言
我們今天說一下 PHP 編程中,定義一個常量所使用的兩種方法。有哪些區別,以及哪種是最佳實踐?
問題
有開發者說,我在學習編寫 PHP,可是定義常量的方法很是讓人迷惑。比如有下面這樣的寫法:
define('FOO', 1);const FOO = 1;
而且在框架中,也大量地摻雜著兩種定義方法的混用。到底哪一個好?
深層原因
對于 PHP5.3 及以上,定義一個常量有兩種方法,一個是用 const 關鍵字,一個是使用 define 函數。比如這樣寫:
const FOO = 'BAR';define('FOO', 'BAR');
這兩種方式之間的根本區別是const在編譯時定義常量,而define在運行時定義常量。這導致了大多數const的缺點。下面列舉一些:
1 - const不能用于有條件地定義常量。要定義全局常量,必須在最外層范圍中使用它:
if (...) { const FOO = 'BAR'; // 無效}// 但是if (...) { define('FOO', 'BAR'); // 有效}
一種常見的應用是檢查常量是否已經定義:
if (!defined('FOO')) {define('FOO', 'BAR');}
2 - const只能接受一個靜態標量(數字,字符串或其它常量值true,false,null,__FILE__),而define()可使用任何表達式。
const BIT_5 = 1 << 5; // VPHP 5.6 以下版本均無效define('BIT_5', 1 << 5); // 有效
3 - const只能采用簡單的常量名稱,而define()接受任何表達式作為名稱。這樣可以執行以下操作:
for ($i = 0; $i < 32; ++$i) { define('BIT_' . $i, 1 << $i);}
4 - consts始終區分大小寫,而define()允許您通過將其true作為第三個參數傳遞來定義不區分大小寫的常量。
define('FOO', 'BAR', true);echo FOO; // BARecho foo; // BAR
const 的優點
除了上一節所說的 const 的缺點外,我一般都會堅持使用 const。因為它實在太好用,太可愛了。
1 - const使代碼更好讀。
它是一種語言構造,而不是函數,并且與您在類中定義常量的方式保持一致。
2 - const作為一種語言構造,可以通過自動化工具進行靜態分析。
3 - const在當前名稱空間中定義一個常量,同時define()必須傳遞完整的名稱空間名稱:
namespace A\B\C;// 定義常量 A\B\C\FOO:const FOO = 'BAR';define('A\B\C\FOO', 'BAR');
4 - 由于PHP 5.6const常量也可以是數組,而define()尚不支持數組。但是,PHP 7中的兩種情況都支持數組。
const FOO = [1, 2, 3]; // PHP 5.6 及以上有效define('FOO', [1, 2, 3]); // PHP 7.0 及以上有效
5 - const還可以在類或接口內使用它來定義類常量或接口常量。define沒這功能。
class Foo {const BAR = 2; // 完全支持}// 但是class Baz {define('QUX', 2); // 不能這么寫}
寫在最后
除非特別需要,我一般不使用 define 定義常量,可讀性不強。
加上框架中強制的 OOP 方式,使得我們自覺不自覺地形成 const 定義類常量的習慣。而且對于 IDE 的自動索引也極為友好,寫代碼順溜的不得了。
Happy coding :_)
我是 @程序員小助手 ,持續分享編程知識,歡迎關注。