“while (true)” 和 “while (\true)” 有什么区别?

php
2022-08-30 17:00:23

vs之间的区别是什么,最重要的是任何人都可以澄清为什么会受到命名空间的影响?while (true)while (\true)booleanPHP


答案 1

在 PHP 中,和 是常量,它们受到保护,不会在命名空间中被覆盖。因此,以下代码无效:truefalsenull

namespace Foo;
const true = false; // Cannot redeclare constant 'true'

仍然可以使用“define()”覆盖这样的常量:

namespace Foo;
define('Foo\true', false);
var_dump(true); // bool(false)

然而,这不是受支持的功能(它可能被称为错误),PHP可以自由地假设它不能被覆盖。例如,在 constexpr 上下文中的使用将不受上述定义的影响:truetrue

// 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 中修复此问题。truefalsenull


答案 2

推荐