2014-09-24 157 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

相關問題