为了账号安全,请及时绑定邮箱和手机立即绑定

define()与const

define()与const

PHP
守着一只汪 2019-07-27 14:58:53
define()与const在PHP中,你什么时候使用define('FOO', 1);你什么时候用的const FOO = 1;?这两者之间的主要区别是什么?
查看完整描述

3 回答

?
Helenr

TA贡献1780条经验 获得超4个赞

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

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

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

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

    if (...) {
        const FOO = 'BAR';    // Invalid}// butif (...) {
        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 previouslydefine('BIT_5', 1 << 5); // Always valid
  • const采用普通的常量名称,而define()接受任何表达式作为名称。这允许做这样的事情:

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

    define('FOO', 'BAR', true);echo FOO; // BARecho 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.6define('FOO', [1, 2, 3]); // Invalid in PHP 5.6 and valid in PHP 7.0

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

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

摘要

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


查看完整回答
反对 回复 2019-07-27
?
四季花海

TA贡献1811条经验 获得超5个赞

直到PHP 5.3,const才能在全球范围内使用。你只能在课堂上使用它。当您想要设置某种常量选项或与该类相关的设置时,应该使用此选项。或许你想创造某种枚举。

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

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

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


查看完整回答
反对 回复 2019-07-27
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

我知道这已经得到了解答,但目前的答案都没有提到命名空间以及它如何影响常量和定义。

从PHP 5.3开始,consts和define在大多数方面都是类似的。但是,仍然存在一些重要的差异:

  • 无法从表达式定义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));}

用户子阵列的内容将是['foo\\BAR' => 1, 'BAZ' => 2, 'foo\\BAZ' => 3]

===更新===

即将推出的PHP 5.6将提供更多的灵活性const。现在,您可以根据表达式定义consts,前提是这些表达式由其他consts或文字组成。这意味着以下内容自5.6起有效:

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

但是,您仍然无法根据变量或函数返回来定义consts

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

仍然会出局。


查看完整回答
反对 回复 2019-07-27
  • 3 回答
  • 0 关注
  • 478 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信