`while(true)`vs`while(\ true)`之间有什么区别?

时间:2014-09-24 18:20:41

标签: php

while (true)while (\true)之间的区别是什么?最重要的是,任何人都可以澄清为什么booleanPHP的名称空间影响了{{1}}?

1 个答案:

答案 0 :(得分:56)

在PHP true中,falsenull是常量,可以防止在名称空间中被覆盖。因此以下是无效代码:

namespace Foo;
const true = false; // Cannot redeclare constant 'true'

仍然可以使用''define()''覆盖这样的常量:

namespace Foo;
define('Foo\true', false);
var_dump(true); // bool(false)

然而,这是不受支持的功能(可能称为错误),PHP可以自由地假设true无法被覆盖。例如,constexpr上下文中true的使用不受上述定义的影响:

// Note: This uses eval() to make sure the define() runs before the constexpr
//       constant resolution happens

namespace Foo;
define('Foo\true', false);
var_dump(eval('namespace Foo;
static $t = true;
return $t;')); // bool(true)

替换发生在constexpr案例中,而不是“正常”案例中的原因是实现中的错误。对于constexprs,替换发生在名称解析之前,而对于普通代码,它发生在名称解析之后。

正确的实施方式是在名称解析后始终替换,但在替换期间专门考虑truefalsenull。我打算为PHP 7解决这个问题。