define()与const

在PHP中,何时使用

定义(’FOO’,1);

你什么时候用

常量FOO=1;

?

这两者之间的主要区别是什么

从PHP 5.3开始,有两种定义常量的方法:使用const关键字或使用define()函数:

常量FOO='BAR';
定义('FOO','BAR');

这两种方法的根本区别在于const在编译时定义常量,而define在运行时定义常量。这导致了大部分常量的缺点。const的一些缺点是:

  • const不能用于有条件地定义常量。要定义全局常量,必须在最外层范围内使用它:

    如果(…){
    const FOO='BAR';//无效
    }
    //但是
    如果(…){
    定义('FOO','BAR');//有效
    }
    

    你为什么要这么做?一个常见的应用是检查常量是否已定义:

    如果(!defined('FOO')){
    定义('FOO','BAR');
    }
    
  • const接受静态标量(数字、字符串或其他常量,如truefalsenull\uuuuuuuuuuu文件),而define()接受任何表达式。由于PHP 5.6常量表达式也可以在const中使用:

    常量位5=1&lt&书信电报;5;    // 自PHP 5.6起有效,以前无效
    定义('BIT_5',1<<5);//始终有效
    
  • const采用普通常量名称,而define()接受任何表达式作为名称。这允许您执行以下操作:

    ($i=0;$i<32;++$i)的

    {
    定义('BIT.'$i,1<<$i);
    }
    
  • consts始终区分大小写,而define()允许您通过将true作为第三个参数来定义不区分大小写的常量(注意:从PHP 7.3.0开始,不推荐使用定义不区分大小写的常量,从PHP 8.0.0开始删除):

    定义('FOO','BAR',true);
    echo FOO;//酒吧
    echo foo;//酒吧
    

所以,这是事情不好的一面。现在让我们看看我个人为什么总是使用const,除非出现上述情况之一:

  • const读起来更漂亮。它是一种语言构造而不是函数,并且与在类中定义常量的方式一致

  • const,作为一种语言结构,可以通过自动化工具进行静态分析

  • const在当前命名空间中定义一个常量,而define()必须传递完整的命名空间名称:

    名称空间A\B\C;
    //要定义常量A\B\C\FOO:
    const FOO='BAR';
    定义('A\B\C\FOO','BAR');
    
  • 由于PHP5.6const常量也可以是数组,而define()还不支持数组。但是,在PHP7中,这两种情况都支持数组

    常量FOO=[1,2,3];//在PHP5.6中有效
    定义('FOO',[1,2,3]);//在PHP5.6中无效,在PHP7.0中有效
    

最后,请注意,const也可以在类或接口中用于定义类常量或接口常量定义不能用于此目的:

类Foo{
常数条=2;//有效
}
//但是
Baz类{
定义('QUX',2);//无效
}

摘要

除非您需要任何类型的条件定义或表达式定义,否则请使用consts而不是define()s-这仅仅是为了可读性

发表评论