“while (true)” 和 “while (\true)” 有什么区别?
2022-08-30 17:00:23
vs之间的区别是什么,最重要的是任何人都可以澄清为什么会受到命名空间的影响?while (true)
while (\true)
boolean
PHP
vs之间的区别是什么,最重要的是任何人都可以澄清为什么会受到命名空间的影响?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可以自由地假设它不能被覆盖。例如,在 constexpr 上下文中的使用将不受上述定义的影响:true
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,替换发生在名称解析之前,而对于普通代码,它发生在名称解析之后。
正确的实现是始终在名称解析之后进行替换,但要特别注意 ,并在替换期间进行替换。我计划在 PHP 7 中修复此问题。true
false
null