2016-06-17 5 views

Antwort

3

Es ist eine Beschränkung der PHP-Compiler und es wird in den documentation erläutert:

Wie jede andere PHP statische Variable, statische Eigenschaften können ein Literal oder konstant vor PHP 5.6 unter Verwendung von nur initialisiert werden; Ausdrücke sind nicht erlaubt. In PHP 5.6 und höher gelten die gleichen Regeln wie bei const-Ausdrücken: Einige begrenzte Ausdrücke sind möglich, sofern sie zur Kompilierzeit ausgewertet werden können.

Die Kernaussage ist hier: „sofern sie zum Zeitpunkt der Kompilierung ausgewertet werden kann“.

Von der Fehlermeldung Sie, ich kann Ihnen sagen, PHP 5. PHP 7 die Fehlermeldung umformuliert wurde verwenden, das Problem offenbar zu erklären. Es heißt "Konstante Ausdruck enthält ungültige Operationen".

Die Deklaration der ersten statischen Variablen ($one) kompiliert, weil Sie es mit einem konstanten Ausdruck initialisiert werden. ['a','b'] ist ein Array von Strings, es kann zur Kompilierzeit ausgewertet werden, alles ist in Ordnung. Die zweite statische Variable ($two) wird mit einem nicht konstanten Ausdruck initialisiert (Test::$one). Test::$one ist eine Variable. Sie können feststellen, dass der Anfangswert des Werts zum Zeitpunkt der Kompilierung bekannt ist (siehe obiger Absatz) und der Ausdruck zum Zeitpunkt der Kompilierung ausgewertet werden kann.

Dieses Verhalten erfordert eine tiefere Analyse des Codes bei der Kompilierung. Es ist wahrscheinlich in C++ - oder Java-Compilern implementiert, aber dies sind Sprachen, die nur einmal kompiliert werden und der Code, den sie generieren, wird in einer Datei gespeichert und später ausgeführt oder interpretiert. Der PHP-Compiler funktioniert aus einem bestimmten Grund nicht so. Es kompiliert das Skript vor jeder Ausführung, daher zielt es darauf ab, die Kompilierung so schnell wie möglich abzuschließen, und bemüht sich nicht um Codeanalyse und -optimierung.

Update:

Als @deceze legt in einem comment, der Ausdruck Test::$one kann nicht in der Erklärung von $two ausgewertet werden, da es Klasse verwendet Test, die nicht vollständig an dieser Stelle definiert ist. Selbst die Compiler anderer Sprachen, die diese Art von Referenz zulassen, können den Wert Test::$one nicht berechnen, wenn sie die Deklaration $two erreichen. Sie müssen einen zweiten Kompilierungsdurchlauf verwenden, um sie auswerten zu können.

+0

auch darüber hinaus, 'Test :: one' $ ist einfach an dieser Stelle nicht möglich, weil das Parsen der' test' Klassendefinition noch nicht abgeschlossen hat. – deceze

Verwandte Themen