`while(true)`vs`while(\ true)`之间有什么区别?

Bab*_*aba 25 php

while (true)vs while (\true)和most 之间有什么区别重要的是,任何人都可以澄清为什么boolean会受命名空间影响PHP

Nik*_*kiC 56

在PHP中true,falsenull为常数,这是保护,在命名空间被覆盖.因此以下是无效代码:

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,falsenull在替换时.我打算为PHP 7解决这个问题.

  • +1 for*我打算为PHP 7*修复此问题 (31认同)
  • Php引用7 Unquote. (3认同)
  • 我当时正在开玩笑......我不知道php会跳过6然后直接进入7.在这种情况下,我会看到github的alphas,beta和早期快照!:) (3认同)