define()vs const

非常简单的问题:在PHP中,你什么时候使用

define('FOO', 1);

你什么时候用

const FOO = 1;

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


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

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

这两种方式之间的根本区别在于const在编译时定义了常量,而define在运行时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, invalid previously
    define('BIT_5', 1 << 5); // always valid
    
  • const一个普通的常量名,而define()接受任何表达式作为名称。 这允许做这样的事情:

    for ($i = 0; $i < 32; ++$i) {
        define('BIT_' . $i, 1 << $i);
    }
    
  • const s始终区分大小写,而define()允许您通过将true作为第三个参数来定义不区分大小写的常量:

    define('FOO', 'BAR', true);
    echo FOO; // BAR
    echo foo; // BAR
    
  • 所以,那是事情的坏处。 现在让我们来看看为什么我个人总是使用const除非发生上述情况之一:

  • const只读更好。 它是一种语言结构而不是函数,并且与您在类中定义常量的方式一致。
  • const在当前命名空间中定义一个常量,而define()必须传递完整的命名空间名称:

    namespace ABC;
    // To define the constant ABCFOO:
    const FOO = 'BAR';
    define('ABCFOO', '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, valid in PHP 7.0
    
  • 由于const是语言结构,并且在编译时定义,它们比define()更快一些。

    众所周知,当使用大量的常量时,PHP define()很慢。 人们甚至发明了像apc_load_constants()hidef这样的东西来解决这个问题。

    const使得const的定义大约快两倍(在开发XDebug的机器上打开更多)。 另一方面,查找时间不会改变(因为两个常量类型共享相同的查找表):演示。

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

    class Foo {
        const BAR = 2; // valid
    }
    // but
    class Baz {
        define('QUX', 2); // invalid
    }
    

    概要

    除非需要任何类型的条件或表达式定义,否则使用const s而不是define() s - 仅仅为了便于阅读!


    在PHP 5.3之前, const不能在全局范围内使用。 你只能在课堂上使用它。 当你想要设置某种常量选项或与该类相关的设置时,应该使用这个选项。 或者,也许你想创建某种枚举。

    define可以用于相同的目的,但它只能在全局范围内使用。 它只应用于影响整个应用程序的全局设置。

    一个很好的const用法的例子是摆脱幻数。 看看PDO的常量。 例如,当您需要指定提取类型时,可以键入PDO::FETCH_ASSOC 。 如果不使用const,你最终会输入类似35东西(或者FETCH_ASSOC定义的FETCH_ASSOC )。 这对读者来说没有意义。

    一个好的define用法的例子可能是指定你的应用程序的根路径或一个库的版本号。


    我知道这已经被回答了,但是目前的答案都没有提到任何关于命名空间的内容,以及它如何影响常量和定义。

    从PHP 5.3开始,常量和定义在大多数方面是相似的。 但是,仍然存在一些重要的区别:

  • Consts不能从表达式中定义。 const FOO = 4 * 3; 不起作用,但define('CONST', 4 * 3); 确实。
  • 传递给define的名称必须包含要在该名称空间内定义的名称空间。
  • 下面的代码应该说明不同之处。

    namespace foo 
    {
        const BAR = 1;
        define('BAZ', 2);
        define(__NAMESPACE__ . 'BAZ', 3);
    }
    
    namespace {
        var_dump(get_defined_constants(true));
    }
    

    用户子数组的内容为['fooBAR' => 1, 'BAZ' => 2, 'fooBAZ' => 3]

    ===更新===

    即将到来的PHP 5.6将允许const具有更多的灵活性。 您现在可以根据表达式定义const,只要这些表达式由其他常量或文字组成。 这意味着以下内容应该从5.6开始有效:

    const FOOBAR = 'foo ' . 'bar';
    const FORTY_TWO = 6 * 9; // For future editors: THIS IS DELIBERATE! Read the answer comments below for more details
    const ULTIMATE_ANSWER = 'The ultimate answer to life, the universe and everything is ' . FORTY_TWO;
    

    尽管如此,你仍然无法通过变量或函数返回来定义const

    const RND = mt_rand();
    const CONSTVAR = $var;
    

    仍然会出局。

    链接地址: http://www.djcxy.com/p/3619.html

    上一篇: define() vs const

    下一篇: What is the difference between const int*, const int * const, and int const *?