2014-09-24 101 views
24

while (true)while (\true)和最重要的任何人都可以澄清为什么boolean受名称空间影响PHP'while(true)`vs`while( true)`有什么区别?

+7

https://github.com/igorw/retry/issues/3 - *“这看起来好一点,但是在顶部有一个效率相当低的FETCH_CONSTANT指令。这需要对igorw \ true进行命名空间查找,我们可以通过用while(true)替换while(true)来优化它。 这会摆脱FETCH_CONSTANT调用,并将布尔值设为内联:“* – 2014-09-24 18:23:29

+2

' TRUE/FALSE'的行为与其他常量一样http://php.net/manual/en/reserved.constants.php – 2014-09-24 18:25:48

+4

自5.3.0版本开始,所有的函数/类/变量/常量/ etc都在PHP中被命名空间,而真/ false/null/etc是常量,就像您可能自己定义的任何常量一样......大多数属于全局名称空间,但PHP将首先检查当前名称空间,然后检查全局名称空间没有在当前命名空间中找到它们,所以使用该前缀可以防止当前名称空间检查的开销 – 2014-09-24 18:30:26

回答

55

在PHP truefalsenull是常量,它们在名称空间中被保护不被覆盖。因此下面的无效代码:

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

但仍可以覆盖这样一个常数使用“”定义()“”:

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

然而,这是不支持的功能(可能被称为bug),PHP可以自由地假定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情况下,而不是在“正常”情况的原因是在实现中的错误:在一个constexpr上下文的true例如使用将不受上述定义的影响。对于constexprs,替换发生在名称解析之前,而对于正常的代码,它发生在名称解析之后。

正确的实现方式是始终在名称解析后替换,但在替换过程中特别考虑了true,falsenull。我打算修复这个PHP 7的问题。

+31

+1 *我打算解决这个PHP 7 * – ircmaxell 2014-09-24 19:09:07

+3

PHP引用7未引用。 – Jimbo 2014-09-25 13:00:19

+1

@tftd无法判断你是否讽刺。你知道PHP 7是PHP的下一个版本吗?我们正在跳过6. – mpen 2014-09-26 02:06:04

相关问题