在PHP中,你可以用两种方式声明常量:

使用define关键字 定义(“FOO”,1); 使用const关键字 const FOO = 1;


这两者之间的主要区别是什么? 什么时候,为什么要使用一种,什么时候使用另一种?


当前回答

定义我用于全局常量。

const用于类常量。

不能在类范围内定义,而使用const可以。

同样,使用const,它实际上成为类的成员,而使用define,它将被推入全局作用域。

其他回答

是的,const是在编译时定义的,因为nikic状态不能被分配一个表达式,而define()可以。但是const也不能有条件地声明(出于同样的原因)。ie。你不能这样做:

if (/* some condition */) {
  const WHIZZ = true;  // CANNOT DO THIS!
}

而使用define()则可以。所以,这并不取决于个人喜好,两者都有正确和错误的使用方式。

题外话……我想看到某种类型的类const,可以分配一个表达式,一种定义(),可以隔离到类?

定义我用于全局常量。

const用于类常量。

不能在类范围内定义,而使用const可以。

同样,使用const,它实际上成为类的成员,而使用define,它将被推入全局作用域。

补充一下尼克的回答。Const可以在类中以以下方式使用:

class Foo {
    const BAR = 1;

    public function myMethod() {
        return self::BAR;
    }
}

使用define()不能做到这一点。

这些答案大多是错误的,或者只说了一半。

可以通过使用名称空间来限定常量的范围。 你可以在类定义之外使用“const”关键字。然而,就像在 使用"const"关键字赋值的类必须是 常数表达式。

例如:

const AWESOME = 'Bob'; // Valid

不好的例子:

const AWESOME = whatIsMyName(); // Invalid (Function call)
const WEAKNESS = 4+5+6; // Invalid (Arithmetic) 
const FOO = BAR . OF . SOAP; // Invalid (Concatenation)

使用define()创建变量常量,如下所示:

define('AWESOME', whatIsMyName()); // Valid
define('WEAKNESS', 4 + 5 + 6); // Valid
define('FOO', BAR . OF . SOAP); // Valid

我知道这个问题已经有人回答了,但是目前的回答都没有提到名称空间以及它如何影响常量和定义。

从PHP 5.3开始,const和define在大多数方面是相似的。然而,仍有一些重要的区别:

常量不能从表达式中定义。const FOO = 4 * 3;定义('CONST', 4 * 3);所做的事。 传递给定义的名称必须包括要在该名称空间中定义的名称空间。

下面的代码将说明其中的区别。

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

namespace {
    var_dump(get_defined_constants(true));
}

user子数组的内容将是['foo\\BAR' => 1, 'BAZ' => 2, 'foo\\BAZ' => 3]。

=== update ===

即将到来的PHP 5.6将允许const具有更大的灵活性。现在可以用表达式来定义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;

还是会出来的。