[翻译]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()

相关文章
相关标签/搜索