Heim >Backend-Entwicklung >PHP-Tutorial >Implementierung des Bereichsbetreibers in PHP
Dieser Artikel, der ursprünglich von Thomas Punt verfasst und mit Genehmigung nachgedruckt wurde, beschreibt die Erstellung eines benutzerdefinierten Bereichs (| & gt;) in PHP. Es ist ein tiefes Eintauchen in PHP -Interna, unter der Annahme, dass sie mit der Erstellung von PHP aus der Quelle vertraut sind (siehe PHP -Interna -Buch, um Anleitung zu erhalten).
Der Prozess beinhaltet die Änderung von vier Schlüsselbereichen: Lexer, Parser, Kompilierungsphase und Zend Vm.
Schlüsselschritte:
Lexer -Update: Der Lexer wird geändert (Zend/Zend_Language_Scanner.l) zu erkennen "| & gt;" und generieren Sie ein T_RANGE
Token. RE2C wird dann verwendet, um den Lexer zu regenerieren. Das T_RANGE
Token wird auch in Zend/Zend_Language_Parser.y deklariert. Schließlich erfordert die ext/tokenizer/tokenizer_data.c
Datei die Regeneration mit tokenizer_data_gen.sh
, um sicherzustellen, dass die Tokenizer -Erweiterung das neue Token erkennt.
Parser-Update: Der Parser (Zend/Zend_Language_Parser.y) wird aktualisiert, um die Verwendung, die Vorrang (gleiche wie der Raumschiffbetreiber) und Assoziativität (nicht assoziativ, Verhinderung der Erkette) des T_RANGE
Bediener. Ein neuer AST -Knoten (ZEND_AST_RANGE
) wird in Zend/zend_ast.h
erstellt.
Compilation Stufe Update: Die Kompilierungsstufe (Zend/Zend_Compile.c) wird so geändert, dass der ZEND_AST_RANGE
AST -Knoten verarbeitet wird. Eine zend_compile_range
-Funktion wird hinzugefügt, die einen ZEND_RANGE
opcode ausgibt.
Zend VM Update: Der Zend VM (Zend/Zend_vm_def.h) wird aktualisiert, um den ZEND_RANGE
opcode zu verarbeiten. Dies beinhaltet die Definition des Verhaltens des Opcode, einschließlich der Handhabung verschiedener Operandentypen (nur Ganzzahlen und Schwimmer), Fehlerbehandlung (Ausnahmen für ungültige Eingänge oder übermäßig große Bereiche) und das Erzeugen des resultierenden Arrays. Die Zend VM wird mit Zend/zend_vm_gen.php
regeneriert. Schließlich wird der AST Pretty Printer in Zend/zend_ast.c
aktualisiert, um den neuen Bediener korrekt anzuzeigen.
Semantik des Bereichs von Bereichsbetreiber:
Der Operator |>
erstellt ein Array basierend auf zwei Operanden (min und max):
min == max
, gibt ein Einzel-Element-Array zurück. Error
oder der Bereich zu groß ist. min > max
Beispiele:
<code class="language-php">1 |> 3; // [1, 2, 3] 2.5 |> 5; // [2.5, 3.5, 4.5] $a = $b = 1; $a |> $b; // [1] 2 |> 1; // Error exception 1 |> '1'; // Error exception new StdClass |> 1; // Error exception</code>
Diese detaillierte Erklärung bietet einen umfassenden Überblick über den Prozess. Der Artikel kommt zu dem Schluss, dass es sich um eine Implementierung handelt und eine effizientere Version in einem zukünftigen Artikel untersucht wird. Ein FAQ -Abschnitt ist ebenfalls enthalten, der gemeinsame Fragen zum Gebrauch und Verhalten des Bereichsbetreibers abdeckt.
Das obige ist der detaillierte Inhalt vonImplementierung des Bereichsbetreibers in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!