while (true)
和 while (\true)
有什么区别? 更重要的是,为什么在 PHP
中命名空间会影响 boolean
类型?
while (true)
和 while (\true)
有什么区别? 更重要的是,为什么在 PHP
中命名空间会影响 boolean
类型?
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情况下发生替换的原因是实现中的一个bug。对于constexpr,替换发生在名称解析之前,而对于普通代码,则发生在名称解析之后。
正确的实现应该始终在名称解析之后进行替换,但在替换过程中特别考虑true、false和null。我计划在PHP 7中修复这个问题。
TRUE/FALSE
会像其他常量一样运作。请参考 http://php.net/manual/en/reserved.constants.php。 - Michael Berkowski\
前缀可以避免当前命名空间检查的开销。 - Mark BakerNikiC
刚刚确认由于实现中的一个错误,导致了FETCH_CONSTANT
被调用。 - Baba