0%

const 和 define 在 PHP 中的区别

在 PHP 中,constdefine 都可以用来定义常量。但二者之间有什么区别呢?

const 和 define 的区别

  • const 是在编译阶段定义的,define 是在运行时定义的。 因此,const 不可以有条件的定义,但是 define 可以。

    1
    2
    3
    4
    5
    6
    7
    if (...) {
    const FOO = 'BAR'; //非法的
    }
    //然而
    if (...) {
    define('FOO', 'BAR');//合法的
    }
  • const 只能接受静态标量(数字,字符串或者像 true、false、null、__FILE__等其他常量),而 define 接受任何表达式。不过从 PHP 5.6 开始,const 也开始支持表达式。

  • const 采用普通的常量名称,而 define 接受任何表达式作为名称。他可以做这样用:

    1
    2
    3
    for ($i = 0; $i < 32; ++$i) {
    define('BIT_' . $i, 1 << $i);
    }
  • const 的名称是大小写敏感的,但是 define 可以通过传递第三个参数为 true 来定义不区分名称大小写的常量。

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

为什么我更赞成使用 const

  • const 可读性更好。const 是一种语言结构而不是函数,而且能够在类中进行定义。

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

  • const 在当前命名空间中定义常量,而 define 必须传进去整个命名空间名。

    1
    2
    3
    4
    namespace A\B\C;
    // 比如要设置 A\B\C\FOO:
    const FOO = 'BAR';
    define('A\B\C\FOO', 'BAR');
  • const 从 PHP 5.6 开始支持被定义为数组,但是 define 还不支持。不过从 PHP 7 开始,两者都支持定义为数组了。

最后,请记住 const 可以在类和接口中定义类常量或者接口常量,但是 define 不能这样做 。

1
2
3
4
5
6
class Foo {
const BAR = 2; // 合法
}
class Baz {
define('QUX', 2); // 非法
}

总结

除非你需要根据条件和表达式来定义常量,否则使用 const 而不是 define - 只是为了便于阅读!

翻译自 define() vs const,版权归原作者所有。