[Problem]
Trotz vorheriger Programmiererfahrung ein Anfänger in PHP ist durch einen Attribut-Standardfehler verwirrt. Der Code:
class Foo {
public $path = array(
realpath(".")
);
}
führt zu einem Syntaxfehler. Folgendes funktioniert jedoch nahtlos:
$path = array(
realpath(".")
);
Es stellt sich die Frage: Warum können Funktionen nicht in Attributstandards aufgerufen werden? Ist dies beabsichtigt oder ein Fehler in der Implementierung?
[Antwort]
Der PHP-Compilercode weist darauf hin, dass diese Einschränkung beabsichtigt ist, obwohl keine offizielle Begründung verfügbar ist. Die zuverlässige Implementierung dieser Funktionalität stellt gewisse Herausforderungen dar, wie die Einschränkungen in der aktuellen PHP-Implementierung zeigen.
Die Grammatik des Compilers definiert eine Klassenvariablendeklaration als:
class_variable_declaration: //... | T_VARIABLE '=' static_scalar //... ;
Um Variablenwerte wie $path zuzuweisen, muss der erwartete Wert daher an einem statischen Skalar ausgerichtet sein. Dies umfasst Arrays mit Werten, die ebenfalls statische Skalare sind:
static_scalar: /* compile-time evaluated scalars */ //... | T_ARRAY '(' static_array_pair_list ')' // ... //... ;
Wenn die Grammatik die folgende Syntax zulässt, die mit dem Codebeispiel übereinstimmt, würde das Skript auf den Fehler „Ungültiger Bindungstyp“ stoßen:
class_variable_declaration: //... | T_VARIABLE '=' T_ARRAY '(' array_pair_list ')' // ... ;
Das Parsen des angegebenen Codebeispiels zeigt die folgenden Schritte:
zend_do_begin_class_declaration() // Adds an opcode array_init(), zend_do_add_static_array_element() // Do not create new opcodes, add array to class properties zend_do_declare_property() // Declares the property zend_do_early_binding() // Consumes the last opcode and evaluates it
Wenn der Opcode nicht erwartet wird (z. B. im Zusammenhang mit Funktionen oder Methoden), wird ein Fehler ausgegeben.
Zulassen nicht statischer Arrays generiert einen INIT_ARRAY-Opcode, der zend_do_early_binding():
DECLARE_CLASS 'Foo' SEND_VAL '.' DO_FCALL 'realpath' INIT_ARRAY
Um Funktionsaufrufe in Attributstandards zu berücksichtigen, wäre ein neues Opcode-Array mit Gültigkeitsbereich für die Klassenvariablendeklaration erforderlich, ähnlich wie bei Methodendefinitionen. Die Bestimmung des Zeitpunkts einer solchen Auswertung stellt jedoch zusätzliche Herausforderungen dar.
Andere dynamische Sprachen haben es geschafft, dieses Problem zu lösen, aber es bleibt eine Funktion, die in PHP fehlt, möglicherweise aufgrund seiner Komplexität und der wahrgenommenen niedrigen Priorität.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3