PHP-Code-Generator
- Unterstützt alle aktuellen PHP-Funktionen (wie Property Hooks, Enums, Attribute usw.)
- Ermöglicht die einfache Änderung bestehender Klassen
- Ausgabe in Übereinstimmung mit PSR-12 / PER-Kodierung
- Ausgereifte, stabile und weit verbreitete Bibliothek
Installation
Laden Sie das Paket herunter und installieren Sie es mit Composer:
Für die PHP-Kompatibilität siehe die Tabelle.
Klassen
Beginnen wir mit einem einfachen Beispiel für die Erzeugung von Klassen mit ClassType:
Es wird dieses Ergebnis wiedergeben:
Wir können auch einen Drucker verwenden, um den Code zu erzeugen, den wir im Gegensatz zu echo $class
weiter konfigurieren können:
Wir können Konstanten (Klasse Constant) und Eigenschaften (Klasse Property) hinzufügen:
Es erzeugt:
Und wir können Methoden hinzufügen:
Das Ergebnis ist:
Die mit PHP 8.0 eingeführten promotierten Parameter können an den Konstruktor übergeben werden:
Das Ergebnis ist:
Readonly-Eigenschaften und -Klassen können über setReadOnly()
markiert werden.
Wenn die hinzugefügte Eigenschaft, Konstante, Methode oder der Parameter bereits existiert, wird eine Ausnahme ausgelöst.
Mitglieder können mit removeProperty()
, removeConstant()
, removeMethod()
oder
removeParameter()
entfernt werden.
Sie können auch bestehende Method
, Property
oder Constant
Objekte zur Klasse
hinzufügen:
Mit cloneWithName()
können Sie vorhandene Methoden, Eigenschaften und Konstanten mit einem anderen Namen
klonen:
Schnittstelle oder Trait
Sie können Schnittstellen und Traits (Klassen InterfaceType und TraitType) erstellen:
Eigenschaften verwenden:
Ergebnis:
Enums
Sie können ganz einfach die Enums erstellen, die PHP 8.1 mitbringt (Klasse EnumType):
Ergebnis:
Sie können auch skalare Äquivalente für Fälle definieren, um eine zurückgesetzte Aufzählung zu erstellen:
Es ist möglich, jedem Fall einen Kommentar oder Attribute hinzuzufügen, indem Sie
addComment()
oder addAttribute()
verwenden.
Anonyme Klasse
Geben Sie null
als Namen an und Sie haben eine anonyme Klasse:
Ergebnis:
Globale Funktion
Der Code der Funktionen wird die Klasse GlobalFunction erzeugen:
Ergebnis:
Schließung
Der Code von Closures wird die Klasse Closure erzeugen:
Ergebnis:
Pfeil-Funktion
Sie können den Abschluss auch als Pfeilfunktion mit einem Drucker ausdrucken:
Ergebnis:
Methode und Funktionssignatur
Methoden werden durch die Klasse Method repräsentiert. Sie können die Sichtbarkeit und den Rückgabewert festlegen, Kommentare und Attribute hinzufügen usw:
Jeder Parameter wird durch eine Klasse Parameter repräsentiert. Auch hier können Sie jede erdenkliche Eigenschaft einstellen:
Um die sogenannten Variadics-Parameter (oder auch den Splat-, Spread-, Ellipsis-, Unpacking- oder Three Dots-Operator) zu
definieren, verwenden Sie setVariadic()
:
Erzeugt:
Methode und Funktionskörper
Der Körper kann der Methode setBody()
auf einmal oder sequentiell (Zeile für Zeile) durch wiederholten Aufruf
von addBody()
übergeben werden:
Ergebnis
Sie können spezielle Platzhalter verwenden, um Variablen auf praktische Art und Weise zu injizieren.
Einfache Platzhalter ?
Ergebnis:
Variadischer Platzhalter ...?
Ergebnis:
Sie können auch PHP 8 benannte Parameter mit Platzhaltern verwenden ...?:
Platzhalter mit Schrägstrich ausblenden \?
Ergebnis:
Drucker und PSR-Konformität
Die Klasse Printer wird verwendet, um PHP-Code zu erzeugen:
Es kann Code für alle anderen Elemente erzeugen und bietet Methoden wie printFunction()
,
printNamespace()
, etc.
Zusätzlich steht die Klasse PsrPrinter
zur Verfügung, deren Ausgabe dem PSR-2 / PSR-12 / PER-Kodierungsstil
entspricht:
Möchten Sie das Verhalten an Ihre Bedürfnisse anpassen? Erstellen Sie Ihren eigenen Drucker, indem Sie von der Klasse
Printer
erben. Sie können diese Variablen neu konfigurieren:
Wie und warum genau unterscheiden sich der Standard Printer
und PsrPrinter
? Warum gibt es nicht nur
einen Drucker, den PsrPrinter
, in diesem Paket?
Der Standard Printer
formatiert den Code so, wie wir es in ganz Nette tun. Da Nette viel früher als PSR
entstanden ist, und auch weil PSR viele Jahre lang keine Standards rechtzeitig geliefert hat, sondern manchmal sogar mit mehreren
Jahren Verspätung nach der Einführung einer neuen Funktion in PHP, führte dies zu einigen kleinen Unterschieden im Codierungsstandard. Der größte Unterschied ist die Verwendung von
Tabulatoren anstelle von Leerzeichen. Wir wissen, dass wir durch die Verwendung von Tabulatoren in unseren Projekten eine
Breitenanpassung ermöglichen, die für
Menschen mit Sehbehinderungen wichtig ist. Ein Beispiel für einen geringfügigen Unterschied ist die Platzierung der
geschweiften Klammer in einer separaten Zeile für Funktionen und Methoden und immer. Wir halten die PSR-Empfehlung für unlogisch
und führen zu einer Verringerung der Klarheit
des Codes.
Typen
Jeder Typ oder Gewerkschafts-/Schnittstellentyp kann als String übergeben werden, für native Typen können Sie auch vordefinierte Konstanten verwenden:
Das gleiche gilt für die Methode setReturnType()
.
Wörterbücher
Mit Literal
können Sie beliebigen PHP-Code an z.B. Standard-Eigenschafts- oder Parameterwerte etc.
übergeben:
Ergebnis:
Sie können auch Parameter an Literal
übergeben und diese mit Hilfe spezieller Platzhalter in gültigen PHP-Code umwandeln lassen:
Das Literal, das die Erstellung eines neuen Objekts repräsentiert, kann leicht mit der Methode new
erzeugt
werden:
Attribute
Sie können PHP 8 Attribute zu allen Klassen, Methoden, Eigenschaften, Konstanten, Enum-Fällen, Funktionen, Closures und Parametern hinzufügen. Literale können auch als Parameterwerte verwendet werden.
Ergebnis:
Eigentumshaken
Sie können auch Property Hooks (repräsentiert durch die Klasse PropertyHook) für Get- und Set-Operationen definieren, eine Funktion, die in PHP 8.4 eingeführt wurde:
Dies erzeugt:
Eigenschaften und Eigenschaftshaken können abstrakt oder endgültig sein:
Asymmetrische Sichtbarkeit
PHP 8.4 führt eine asymmetrische Sichtbarkeit für Eigenschaften ein. Sie können unterschiedliche Zugriffsebenen für das Lesen und Schreiben festlegen.
Die Sichtbarkeit kann entweder mit der Methode setVisibility()
mit zwei Parametern oder mit
setPublic()
, setProtected()
oder setPrivate()
mit dem Parameter mode
eingestellt werden, der angibt, ob die Sichtbarkeit für das Abrufen oder Setzen der Eigenschaft gilt. Der Standardmodus ist
'get'
.
Dies erzeugt:
Namensraum
Klassen, Traits, Schnittstellen und Enums (im Folgenden Klassen) können in Namespaces (PhpNamespace) gruppiert werden:
Wenn die Klasse bereits existiert, wird eine Ausnahme geworfen.
Sie können Use-Statements definieren:
Um einen voll qualifizierten Klassen-, Funktions- oder Konstantennamen entsprechend den definierten Aliases zu vereinfachen,
verwenden Sie die Methode simplifyName
:
Umgekehrt können Sie einen vereinfachten Klassen-, Funktions- oder Konstantennamen mit der Methode resolveName
in
einen voll qualifizierten Namen umwandeln:
Auflösen von Klassennamen
Wenn eine Klasse Teil eines Namensraums ist, wird sie etwas anders dargestellt: Alle Typen (z.B. Typ-Hinweise, Rückgabetypen, Name der Elternklasse, implementierte Schnittstellen, verwendete Traits und Attribute) werden automatisch aufgelöst (es sei denn, Sie schalten dies aus, siehe unten). Das bedeutet, dass Sie voll qualifizierte Klassennamen in Definitionen verwenden müssen, und diese werden im resultierenden Code durch Aliase (basierend auf Verwendungsklauseln) oder voll qualifizierte Namen ersetzt:
Ergebnis:
Die automatische Auflösung kann auf diese Weise ausgeschaltet werden:
PHP-Dateien
Klassen, Funktionen und Namespaces können in PHP-Dateien gruppiert werden, die durch die Klasse PhpFile repräsentiert werden:
Ergebnis:
Bitte beachten Sie: Außer den Funktionen und Klassen kann den Dateien kein weiterer Code hinzugefügt werden.
Generierung nach vorhandenen Elementen
Neben der Möglichkeit, Klassen und Funktionen mit Hilfe der oben beschriebenen API zu modellieren, können Sie diese auch automatisch anhand vorhandener Klassen und Funktionen generieren lassen:
Funktions- und Methodenkörper sind standardmäßig leer. Wenn Sie diese auch laden wollen, verwenden Sie diesen Weg (dafür
muss nikic/php-parser
installiert sein):
Laden aus PHP-Datei
Sie können auch Funktionen, Klassen, Schnittstellen und Enums direkt aus einem String von PHP-Code laden. Zum Beispiel
erstellen wir das Objekt ClassType
auf diese Weise:
Beim Laden von Klassen aus PHP-Code werden einzeilige Kommentare außerhalb von Methodenkörpern ignoriert (z. B. für Eigenschaften usw.), da diese Bibliothek keine API hat, um mit ihnen zu arbeiten.
Sie können auch die gesamte PHP-Datei direkt laden, die eine beliebige Anzahl von Klassen, Funktionen oder sogar mehrere Namespaces enthalten kann:
Der anfängliche Dateikommentar und die Erklärung strict_types
werden ebenfalls geladen. Alle anderen globalen
Codes werden dagegen ignoriert.
Dazu muss nikic/php-parser
installiert sein.
Wenn Sie globalen Code in Dateien oder einzelne Anweisungen in Methodenkörpern manipulieren müssen, ist es
besser, die Bibliothek nikic/php-parser
direkt zu verwenden.
Klasse Manipulator
Die Klasse ClassManipulator bietet Werkzeuge zur Manipulation von Klassen.
Die Methode inheritMethod()
kopiert eine Methode aus einer übergeordneten Klasse oder einer implementierten
Schnittstelle in Ihre Klasse. Auf diese Weise können Sie die Methode außer Kraft setzen oder ihre Signatur erweitern:
Die Methode inheritProperty()
kopiert eine Eigenschaft aus einer übergeordneten Klasse in Ihre Klasse. Dies ist
nützlich, wenn Sie die gleiche Eigenschaft in Ihrer Klasse haben möchten, aber möglicherweise mit einem anderen
Standardwert:
Die Methode implement()
implementiert automatisch alle Methoden und Eigenschaften der angegebenen Schnittstelle
oder abstrakten Klasse:
Variablen-Dumper
Der Dumper gibt eine parsbare PHP-String-Darstellung einer Variablen zurück. Bietet eine bessere und übersichtlichere Ausgabe
als die native Funktion var_export()
.
Kompatibilitätstabelle
PhpGenerator 4.1 ist kompatibel mit PHP 8.0 bis 8.4.