while (true)
与 while (\true)
之间有什么区别,最重要的是,任何人都可以阐明为什么 boolean
受到影响PHP
中的命名空间 ?
最佳答案
在 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 中解决这个问题。
关于php - `while (true)` 与 `while (\true)` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26023818/