while (true)
与while (\true)
之间的区别是什么?最重要的是,任何人都可以澄清为什么boolean
中PHP
的名称空间影响了{{1}}?
答案 0 :(得分:56)
在PHP true
中,false
和null
是常量,可以防止在名称空间中被覆盖。因此以下是无效代码:
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,替换发生在名称解析之前,而对于普通代码,它发生在名称解析之后。
正确的实施方式是在名称解析后始终替换,但在替换期间专门考虑true
,false
和null
。我打算为PHP 7解决这个问题。