2016-07-19 2 views
2

Betrachten Sie den folgenden Code ein:Warum kann ich ein String-Literal als Klasse in PHP7 verwenden?

class foo { 
    static $bar = 'baz'; 
} 
var_dump('foo'::$bar); 

ein Fehler in PHP5 wirft (wie erwartet):

Einlesefehler: Syntaxfehler, unerwartete '::' (T_PAAMAYIM_NEKUDOTAYIM) in [...] [...] on line


Aber es funktioniert ohne ein Problem in PHP7 und Ausgänge:

string(3) "baz" 

Ist das Absicht oder ein Bug?

+1

Sie diesen Satz am Ende des Satzes hinzufügen: 'Oder bin ich dabei einige thing' ;-) –

+0

Welche Version von PHP5 war dies soll in arbeiten? – mario

+0

Es funktioniert nicht in PHP 5.5 + Ich habe es gerade hier getestet: http://sandbox.onlinephpfunctions.com/ –

Antwort

6

Ich denke, es ist, weil sie Sachen bezüglich Bewertung neu geschrieben haben.

wie folgt aus ist nicht möglich, in PHP5, aber in PHP 7:

echo (new X)->toString(); 

Das Gleiche gilt für

echo ('X')::$bar 

Siehe Changes to the handling of indirect variables, properties, and methods

Dies ist vor allem über die von links nach gehen richtige Bewertung, betrifft aber auch die Bewertung im Allgemeinen.

Weitere Informationen finden Sie auf PHP RFC: Uniform Variable Syntax (Stand: implementiert) zu finden - Dank Nikic:

Diese RFC schlägt die Einführung einer kohärenten und vollständige variable Syntax. Um dieses Ziel zu erreichen, muss die Semantik einiger selten verwendeter Variablenvariabler Konstruktionen geändert werden.

1

Ich kann im Moment nichts in den Dokumenten finden, aber ich würde vermuten, dass dies Verhalten erwartet werden könnte.

Betrachten Sie die folgenden in PHP 5 ohne Fehler:

function hello() 
{ 
    echo "hi"; 
} 
$hi = 'hello'; 
$hi(); 

$hi ist eine Zeichenfolge, so dass es wie sie scheint einfach haben beschlossen, die Unterstützung für Ad-hoc-Strings hinzuzufügen.

Es macht Art von Sinn, dass 'hello'();

in PHP7 gültig ist

aktualisieren

Sie einen kleinen Hinweis auf PHP 7.0.0 an der Unterseite ihrer Beispiele bei http://php.net/manual/en/functions.variable-functions.php finden

+0

Ich sehe Inkonsistenz hier. Unter der Annahme, dass php7 skalare Typen wie string unterstützt, ist es ziemlich seltsam, dass Sie Funktionen oder etwas anderes auf diese Weise aufrufen können. – seclu

+0

@seclu Hmm, ich muss mich darum kümmern, aber ich denke, die anderen beiden Antworten könnten die technischere Erklärung liefern, nach der Sie suchen. Ich habe sie gefunden. – MonkeyZeus

5

Die allgemeine Richtung, in der sich PHP seit Jahren bewegt, war die flexiblere und allgemeinere Verwendung von Variablen, Variablenfunktionen und Variablenklassen. In PHP5, wenn Sie eine Variable Klasse verwenden möchten, müssen Sie den Klassennamen in einer Variablen setzen:

$class = 'foo'; 
echo $class::$foo; 

Es ist wie PHP7 sieht hat diese allgemeinere gemacht, so dass jeder Ausdruck gibt, anstatt dass eine Variable . Zum Beispiel können Sie schreiben:

$c1 = 'f'; 
$c2 = 'oo'; 
echo ($c1 . $c2)::$foo; 
Verwandte Themen