[翻譯]PHP中define()和const定義常量的區別

在PHP中能夠經過define()和const兩種方式定義常量
但是在開發中咱們應該何時用define()定義常量,何時用const定義常量? 這兩種方式定義常量的主要區別是什麼?php

從5.3版本開始PHP有兩種方法來定義常量,使用const關鍵字或者是使用define()方法:數組

const FOO = 'BAR';
define('FOO', 'BAR');

二者之間最大的區別在於const是在編譯時定義常量,而define()方法是在運行時定義常量。ide

  • const不能用在if語句中, defne()能用在if語句中。函數

    if(...) {
         const FOO = 'BAR';//錯誤
     }
     if(...) {
         define('FOO', 'BAR');//正確
     }

    define()的一個經常使用場景是先判斷常量是否已經定義再定義常量:spa

    if(defined('FOO)) {
         define('FOO', 'BAR')
     }
  • const 定義常量時,值只能是靜態標量(數字, 字符串, truefalse, null), 而define()方法能夠把任意表達式的值用做常量的值。從PHP5.6開始const也容許把表達式用做常量的值了。.net

    const BIT_5 = 1 << 5; //PHP5.6後支持,以前的PHP版本不支持
    define('BIT_5', 1 << 5);// 全部PHP版本都支持
  • const 只容許簡單的常量名,而define()能夠把任何表達式的值用做常量名code

    for ($i = 0; $i < 32; $i++) {
        define('BIT_' . $i, 1 << $i);
    }
  • const 定義的常量常量名是大小寫敏感的,而傳遞truedefine()方法的第三個參數時能夠定義大小寫不敏感的常量。接口

    define('FOO', 'BAR', true);
    echo FOO; //BAR
    echo foo; //BAR

上面列舉的都是const相較define()而言的一些缺點或者不靈活的地方,下面咱們看一下爲何我我的推薦用const而不是define()來定義常量(除非要在上述列舉的場景中定義常量)。開發

  • const 具備更好的可讀性,const是語言結構而不是函數,並且與在類中定義類常量的形式保持一致。字符串

  • const在當前的命名空間中定義常量, 而define()要實現相似效果必須在定義時傳遞完整的命名空間名稱:

    namespace A\B\C;
    //To define the constant A\B\C\FOO:
    const FOO = 'BAR';
    define('A\B\C\FOO', 'BAR');
  • const從PHP5.6版本開始能夠把數組用做常量值,而define()在PHP7.0版本開始才支持把數組用做常量值。

    const FOO = [1, 2, 3];// valid in PHP 5.6
    define('FOO', [1, 2, 3]);// invalid in PHP 5.6, valid in PHP 7.0
  • 由於const是語言結構而且在編譯時定義常量因此const會比define() 稍稍快一些。

    衆所周知PHP在用define()定義了大量的常量後會影響效率。 人們設置發明了apc_load_constants()hidef來繞過define()致使的效率問題。

最後,const還能被用於在類和接口中定義常量,define()只能被用於在全局命名空間中定義常量:

class FOO
{
    const BAR = 2;// 正確
}

class Baz
{
    define('QUX', 2)// 錯誤
}

總結:
除非要在if分支裏定義常量或者是經過表達式的值來命名常量, 其餘狀況(即便是隻是簡單的爲了代碼的可讀性)都推薦用const替代define()

相關文章
相關標籤/搜索