一尘不染

define()与const

php

在PHP中,何时使用

define('FOO', 1);

以及何时使用

const FOO = 1;

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


阅读 275

收藏
2020-05-26

共1个答案

一尘不染

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

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

这两种方式之间的根本区别是const在编译时定义常量,而define在运行时定义常量。这导致了大多数const的缺点。的一些缺点const是:

  • const不能用于有条件地定义常量。要定义全局常量,必须在最外层范围中使用它:
    if (...) {
    const FOO = 'BAR';    // Invalid
    

    }
    // but
    if (…) {
    define(‘FOO’, ‘BAR’); // Valid
    }

您为什么仍要这样做?一种常见的应用是检查常量是否已经定义:

    if (!defined('FOO')) {
    define('FOO', 'BAR');
}
  • const接受一个静态标量(数字,字符串或其它恒定等truefalsenull__FILE__),而define()采取的任何表达式。由于PHP 5.6也允许使用常量表达式const

    const BIT_5 = 1 << 5;    // Valid since PHP 5.6 and invalid previously
    

    define(‘BIT_5’, 1 << 5); // Always valid

  • const采用简单的常量名称,而define()接受任何表达式作为名称。这样可以执行以下操作:

    for ($i = 0; $i < 32; ++$i) {
    define('BIT_' . $i, 1 << $i);
    

    }

  • consts始终区分大小写,而define()允许您通过将其true作为第三个参数传递来定义不区分大小写的常量(注意:自PHP 7.3.0起不建议使用不区分大小写的常量。):

    define('FOO', 'BAR', true);
    

    echo FOO; // BAR
    echo foo; // BAR

所以,那是不好的一面。现在,让我们看看const除非出现以下情况之一,否则我个人始终使用的原因:

  • 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’);

  • 由于PHP 5.6 const常量也可以是数组,而define()尚不支持数组。但是,PHP 7中的两种情况都将支持数组。

    const FOO = [1, 2, 3];    // Valid in PHP 5.6
    

    define(‘FOO’, [1, 2, 3]); // Invalid in PHP 5.6 and valid in PHP 7.0

最后,请注意,const还可以在类或接口内使用它来定义类常量或接口常量。define不能用于此目的:

class Foo {
    const BAR = 2; // Valid
}
// But
class Baz {
    define('QUX', 2); // Invalid
}

摘要

除非您需要任何类型的条件或表达式定义,否则使用consts代替define()s-仅出于可读性考虑!

2020-05-26