2014-09-24 17 views
24

Was ist der Unterschied zwischen while (true) vs while (\true) und am wichtigsten kann jemand klären, warum boolean durch Namespace in PHP betroffen sind?Was ist der Unterschied zwischen `while (true)` vs `while ( true)`?

+7

https://github.com/igorw/retry/issues/3 - * "Das sieht schon ein bisschen besser aus. Aber es gibt eine ziemlich ineffiziente FETCH_CONSTANT Anweisung ganz oben. Dies erfordert eine Namespace-Suche gegen igorw \ true. Wir können das optimieren, indem wir while (true) durch while ersetzen (\ true). Dies entfernt den Aufruf FETCH_CONSTANT und setzt den booleschen Wert inline: "* –

+2

" TRUE/FALSE würde sich wie andere Konstanten verhalten http://php.net/manual/en/reserved.constants.php –

+4

Alle Funktionen/Klassen/Variablen/Konstanten/etc sind in PHP seit Version 5.3.0 mit Namespaced, und true/false/null/etc sind Konstanten, genau wie alle Konstanten, die Sie selbst definieren. Die meisten davon befinden sich im globalen Namespace, aber PHP prüft zuerst den aktuellen Namespace und dann den globalen Namespace, falls dies der Fall ist Es findet sie nicht im aktuellen Namespace, daher verhindert die Verwendung dieses Präfixes den Overhead einer aktuellen Namespace-Prüfung –

Antwort

55

In PHP true, false und null sind Konstanten, die vor dem Überschreiben in Namespaces geschützt sind. Als solche ist die folgende ungültig Code:

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

Es ist immer noch möglich ist, eine solche Konstante mit ‚überschrieben‘ definieren() ‚‘:

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

Allerdings wird diese Funktionalität nicht unterstützt (es könnte ein Bug genannt werden) und PHP kann frei davon ausgehen, dass true nicht überschrieben werden kann. Zum Beispiel für die Verwendung von true in einem constexpr Kontext nicht von der obigen Definition betroffen sein:

// 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) 

Der Grund, warum die Substitution in dem constexpr Fall passiert, aber nicht in dem „normalen“ Fall ist ein Fehler bei der Umsetzung . Bei Constexprs findet die Substitution vor der Namensauflösung statt, bei normalem Code nach der Namensauflösung.

Die korrekte Implementierung wäre, nach der Namensauflösung immer zu ersetzen, aber speziell true, false und null während der Substitution zu berücksichtigen. Ich plane, das für PHP 7 zu beheben.

+31

+1 für * Ich plane, dies für PHP 7 zu beheben * – ircmaxell

+3

Php Quote 7 Unquote. – Jimbo

+1

@tftd Kann nicht sagen, ob Sie sarkastisch sind. Sie wissen, dass PHP 7 die nächste Version von PHP ist, oder? Wir überspringen 6. – mpen

Verwandte Themen