„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum können Standard-Funktionsaufrufe in PHP nicht mit Attributen versehen werden?

Warum können Standard-Funktionsaufrufe in PHP nicht mit Attributen versehen werden?

Veröffentlicht am 06.11.2024
Durchsuche:359

Why Can\'t Attribute Defaults Function Calls in PHP?

Funktionen in PHP-Attributstandards können nicht aufgerufen werden

[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.

Freigabeerklärung Dieser Artikel wird unter folgender Adresse abgedruckt: 1729168219 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

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