while (true)vs while (\true)和most 之间有什么区别重要的是,任何人都可以澄清为什么boolean会受命名空间影响PHP?
Nik*_*kiC 56
在PHP中true,false和null为常数,这是保护,在命名空间被覆盖.因此以下是无效代码:
namespace Foo;
const true = false; // Cannot redeclare constant 'true'
Run Code Online (Sandbox Code Playgroud)
仍然可以使用''define()''覆盖这样的常量:
namespace Foo;
define('Foo\true', false);
var_dump(true); // bool(false)
Run Code Online (Sandbox Code Playgroud)
但是,这是不受支持的功能(可能称为错误),PHP可以自由地假设true无法覆盖.例如,trueconstexpr上下文中的使用不受上述定义的影响:
// 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)
Run Code Online (Sandbox Code Playgroud)
替换发生在constexpr案例中,而不是"正常"案例中的原因是实现中的错误.对于constexprs,替换发生在名称解析之前,而对于普通代码,它发生在名称解析之后.
正确的实施将域名解析后总是替补,但具体占true,false并null在替换时.我打算为PHP 7解决这个问题.