PHP-Code-Generator
- Kennt alle neuesten PHP-Features (wie Property Hooks, Enums, Attribute usw.)
- Ermöglicht Ihnen die einfache Modifizierung bestehender Klassen
- Der Ausgabecode entspricht dem PSR-12 / PER Coding Style
- Eine ausgereifte, stabile und weit verbreitete Bibliothek
Installation
Sie können die Bibliothek mit dem Werkzeug Composer herunterladen und installieren:
composer require nette/php-generator
Die PHP-Kompatibilität finden Sie in der Kompatibilitätstabelle.
Klassen
Beginnen wir gleich mit einem Beispiel zur Erstellung einer Klasse mithilfe von ClassType:
$class = new Nette\PhpGenerator\ClassType('Demo');
$class
->setFinal()
->setExtends(ParentClass::class)
->addImplement(Countable::class)
->addComment("Beschreibung der Klasse.\nZweite Zeile\n")
->addComment('@property-read Nette\Forms\Form $form');
// Code einfach durch Typumwandlung in einen String oder mit echo generieren:
echo $class;
Gibt folgendes Ergebnis zurück:
/**
* Beschreibung der Klasse
* Zweite Zeile
*
* @property-read Nette\Forms\Form $form
*/
final class Demo extends ParentClass implements Countable
{
}
Zur Generierung des Codes können wir auch den sogenannten Printer verwenden, den wir im Gegensatz zu echo $class
weiter konfigurieren können:
$printer = new Nette\PhpGenerator\Printer;
echo $printer->printClass($class);
Wir können Konstanten (Klasse Constant) und Variablen (Klasse Property) hinzufügen:
$class->addConstant('ID', 123)
->setProtected() // Sichtbarkeit von Konstanten
->setType('int')
->setFinal();
$class->addProperty('items', [1, 2, 3])
->setPrivate() // oder setVisibility('private')
->setStatic()
->addComment('@var int[]');
$class->addProperty('list')
->setType('?array')
->setInitialized(); // schreibt '= null'
Generiert:
final protected const int ID = 123;
/** @var int[] */
private static $items = [1, 2, 3];
public ?array $list = null;
Und wir können Methoden hinzufügen:
$method = $class->addMethod('count')
->addComment('Zähle es.')
->setFinal()
->setProtected()
->setReturnType('?int') // Rückgabetypen bei Methoden
->setBody('return count($items ?: $this->items);');
$method->addParameter('items', []) // $items = []
->setReference() // &$items = []
->setType('array'); // array &$items = []
Das Ergebnis ist:
/**
* Zähle es.
*/
final protected function count(array &$items = []): ?int
{
return count($items ?: $this->items);
}
Promoted Properties, eingeführt in PHP 8.0, können an den Konstruktor übergeben werden:
$method = $class->addMethod('__construct');
$method->addPromotedParameter('name');
$method->addPromotedParameter('args', [])
->setPrivate();
Das Ergebnis ist:
public function __construct(
public $name,
private $args = [],
) {
}
Readonly-Eigenschaften und -Klassen können mit der Funktion setReadOnly()
markiert werden.
Wenn die hinzugefügte Eigenschaft, Konstante, Methode oder der Parameter bereits existiert, wird eine Ausnahme ausgelöst.
Klassenmitglieder können mit removeProperty()
, removeConstant()
, removeMethod()
oder
removeParameter()
entfernt werden.
Sie können auch vorhandene Method
-, Property
- oder Constant
-Objekte zur Klasse
hinzufügen:
$method = new Nette\PhpGenerator\Method('getHandle');
$property = new Nette\PhpGenerator\Property('handle');
$const = new Nette\PhpGenerator\Constant('ROLE');
$class = (new Nette\PhpGenerator\ClassType('Demo'))
->addMember($method)
->addMember($property)
->addMember($const);
Sie können auch bestehende Methoden, Eigenschaften und Konstanten unter einem anderen Namen mit cloneWithName()
klonen:
$methodCount = $class->getMethod('count');
$methodRecount = $methodCount->cloneWithName('recount');
$class->addMember($methodRecount);
Interface oder Trait
Sie können Schnittstellen und Traits erstellen (Klassen InterfaceType und TraitType):
$interface = new Nette\PhpGenerator\InterfaceType('MyInterface');
$trait = new Nette\PhpGenerator\TraitType('MyTrait');
Verwendung von Traits:
$class = new Nette\PhpGenerator\ClassType('Demo');
$class->addTrait('SmartObject');
$class->addTrait('MyTrait')
->addResolution('sayHello as protected')
->addComment('@use MyTrait<Foo>');
echo $class;
Ergebnis:
class Demo
{
use SmartObject;
/** @use MyTrait<Foo> */
use MyTrait {
sayHello as protected;
}
}
Enums
Aufzählungen (Enums), die mit PHP 8.1 eingeführt wurden, können Sie einfach so erstellen: (Klasse EnumType):
$enum = new Nette\PhpGenerator\EnumType('Suit');
$enum->addCase('Clubs');
$enum->addCase('Diamonds');
$enum->addCase('Hearts');
$enum->addCase('Spades');
echo $enum;
Ergebnis:
enum Suit
{
case Clubs;
case Diamonds;
case Hearts;
case Spades;
}
Sie können auch skalare Äquivalente definieren und so eine “backed” Aufzählung erstellen:
$enum->addCase('Clubs', '♣');
$enum->addCase('Diamonds', '♦');
Zu jedem case kann ein Kommentar oder Attribute mit addComment()
oder
addAttribute()
hinzugefügt werden.
Anonyme Klassen
Wir übergeben null
als Namen und haben eine anonyme Klasse:
$class = new Nette\PhpGenerator\ClassType(null);
$class->addMethod('__construct')
->addParameter('foo');
echo '$obj = new class ($val) ' . $class . ';';
Ergebnis:
$obj = new class ($val) {
public function __construct($foo)
{
}
};
Globale Funktionen
Den Code von Funktionen generiert die Klasse GlobalFunction:
$function = new Nette\PhpGenerator\GlobalFunction('foo');
$function->setBody('return $a + $b;');
$function->addParameter('a');
$function->addParameter('b');
echo $function;
// oder verwenden Sie PsrPrinter für die Ausgabe gemäß PSR-2 / PSR-12 / PER
// echo (new Nette\PhpGenerator\PsrPrinter)->printFunction($function);
Ergebnis:
function foo($a, $b)
{
return $a + $b;
}
Anonyme Funktionen
Den Code anonymer Funktionen generiert die Klasse Closure:
$closure = new Nette\PhpGenerator\Closure;
$closure->setBody('return $a + $b;');
$closure->addParameter('a');
$closure->addParameter('b');
$closure->addUse('c')
->setReference();
echo $closure;
// oder verwenden Sie PsrPrinter für die Ausgabe gemäß PSR-2 / PSR-12 / PER
// echo (new Nette\PhpGenerator\PsrPrinter)->printClosure($closure);
Ergebnis:
function ($a, $b) use (&$c) {
return $a + $b;
}
Kurze Arrow-Funktionen
Sie können auch eine verkürzte anonyme Funktion mit dem Printer ausgeben:
$closure = new Nette\PhpGenerator\Closure;
$closure->setBody('$a + $b');
$closure->addParameter('a');
$closure->addParameter('b');
echo (new Nette\PhpGenerator\Printer)->printArrowFunction($closure);
Ergebnis:
fn($a, $b) => $a + $b
Signaturen von Methoden und Funktionen
Methoden werden durch die Klasse Method repräsentiert. Sie können Sichtbarkeit, Rückgabewert festlegen, Kommentare, Attribute hinzufügen usw.:
$method = $class->addMethod('count')
->addComment('Zähle es.')
->setFinal()
->setProtected()
->setReturnType('?int');
Einzelne Parameter werden durch die Klasse Parameter repräsentiert. Auch hier können Sie alle denkbaren Eigenschaften festlegen:
$method->addParameter('items', []) // $items = []
->setReference() // &$items = []
->setType('array'); // array &$items = []
// function count(array &$items = [])
Zur Definition sogenannter variadischer Parameter (oder auch Splat-Operator) dient setVariadic()
:
$method = $class->addMethod('count');
$method->setVariadic(true);
$method->addParameter('items');
Generiert:
function count(...$items)
{
}
Körper von Methoden und Funktionen
Der Körper kann auf einmal an die Methode setBody()
übergeben oder schrittweise (zeilenweise) durch wiederholten
Aufruf von addBody()
:
$function = new Nette\PhpGenerator\GlobalFunction('foo');
$function->addBody('$a = rand(10, 20);');
$function->addBody('return $a;');
echo $function;
Ergebnis
function foo()
{
$a = rand(10, 20);
return $a;
}
Sie können spezielle Platzhalter verwenden, um Variablen einfach einzufügen.
Einfache Platzhalter ?
$str = 'any string';
$num = 3;
$function = new Nette\PhpGenerator\GlobalFunction('foo');
$function->addBody('return substr(?, ?);', [$str, $num]);
echo $function;
Ergebnis
function foo()
{
return substr('any string', 3);
}
Platzhalter für Variadic ...?
$items = [1, 2, 3];
$function = new Nette\PhpGenerator\GlobalFunction('foo');
$function->setBody('myfunc(...?);', [$items]);
echo $function;
Ergebnis:
function foo()
{
myfunc(1, 2, 3);
}
Sie können auch benannte Parameter für PHP 8 mit ...?:
verwenden:
$items = ['foo' => 1, 'bar' => true];
$function->setBody('myfunc(...?:);', [$items]);
// myfunc(foo: 1, bar: true);
Der Platzhalter wird mit einem Backslash \?
escapet.
$num = 3;
$function = new Nette\PhpGenerator\GlobalFunction('foo');
$function->addParameter('a');
$function->addBody('return $a \? 10 : ?;', [$num]);
echo $function;
Ergebnis:
function foo($a)
{
return $a ? 10 : 3;
}
Printer und PSR-Konformität
Zur Generierung von PHP-Code dient die Klasse Printer:
$class = new Nette\PhpGenerator\ClassType('Demo');
// ...
$printer = new Nette\PhpGenerator\Printer;
echo $printer->printClass($class); // dasselbe wie: echo $class
Er kann Code aller weiteren Elemente generieren und bietet Methoden wie printFunction()
,
printNamespace()
usw.
Es gibt auch die Klasse PsrPrinter
, deren Ausgabe dem PSR-2 / PSR-12 / PER Coding Style entspricht:
$printer = new Nette\PhpGenerator\PsrPrinter;
echo $printer->printClass($class);
Müssen Sie das Verhalten anpassen? Erstellen Sie Ihre eigene Version durch Vererbung der Klasse Printer
. Diese
Variablen können neu konfiguriert werden:
class MyPrinter extends Nette\PhpGenerator\Printer
{
// Zeilenlänge, nach der ein Zeilenumbruch erfolgt
public int $wrapLength = 120;
// Einrückungszeichen, kann durch eine Sequenz von Leerzeichen ersetzt werden
public string $indentation = "\t";
// Anzahl der Leerzeilen zwischen Properties
public int $linesBetweenProperties = 0;
// Anzahl der Leerzeilen zwischen Methoden
public int $linesBetweenMethods = 2;
// Anzahl der Leerzeilen zwischen Gruppen von 'use statements' für Klassen, Funktionen und Konstanten
public int $linesBetweenUseTypes = 0;
// Position der öffnenden geschweiften Klammer für Funktionen und Methoden
public bool $bracesOnNextLine = true;
// Platziert einen einzelnen Parameter auf einer Zeile, auch wenn er ein Attribut hat oder unterstützt wird
public bool $singleParameterOnOneLine = false;
// lässt Namespaces aus, die keine Klasse oder Funktion enthalten
public bool $omitEmptyNamespaces = true;
// Trennzeichen zwischen der rechten Klammer und dem Rückgabetyp von Funktionen und Methoden
public string $returnTypeColon = ': ';
}
Wie und warum unterscheiden sich eigentlich der Standard-Printer
und PsrPrinter
? Warum gibt es im
Paket nicht nur einen Printer, nämlich PsrPrinter
?
Der Standard-Printer
formatiert den Code so, wie wir es in ganz Nette tun. Da Nette viel früher als PSR
entstanden ist und PSR jahrelang keine Standards rechtzeitig lieferte, sondern teilweise erst mit mehrjähriger Verspätung nach
Einführung eines neuen Features in PHP, kam es dazu, dass sich der Codierungsstandard in einigen Kleinigkeiten unterscheidet. Der
größere Unterschied ist nur die Verwendung von Tabulatoren anstelle von Leerzeichen. Wir wissen, dass die Verwendung von
Tabulatoren in unseren Projekten die Anpassung der Breite ermöglicht, was für Menschen mit Sehbehinderungen
unerlässlich ist. Ein Beispiel für einen kleinen Unterschied ist die Platzierung der geschweiften Klammer auf einer
separaten Zeile bei Funktionen und Methoden, und zwar immer. Die Empfehlung von PSR erscheint uns unlogisch und führt zu einer Verringerung der
Code-Übersichtlichkeit.
Typen
Jeder Typ oder Union-/Intersection-Typ kann als String übergeben werden, Sie können auch vordefinierte Konstanten für native Typen verwenden:
use Nette\PhpGenerator\Type;
$member->setType('array'); // oder Type::Array;
$member->setType('?array'); // or Type::nullable(Type::Array);
$member->setType('array|string'); // or Type::union(Type::Array, Type::String)
$member->setType('Foo&Bar'); // oder Type::intersection(Foo::class, Bar::class)
$member->setType(null); // entfernt den Typ
Dasselbe gilt für die Methode setReturnType()
.
Literale
Mit Literal
können Sie beliebigen PHP-Code übergeben, zum Beispiel für Standardwerte von Eigenschaften oder
Parametern usw.:
use Nette\PhpGenerator\Literal;
$class = new Nette\PhpGenerator\ClassType('Demo');
$class->addProperty('foo', new Literal('Iterator::SELF_FIRST'));
$class->addMethod('bar')
->addParameter('id', new Literal('1 + 2'));
echo $class;
Ergebnis:
class Demo
{
public $foo = Iterator::SELF_FIRST;
public function bar($id = 1 + 2)
{
}
}
Sie können auch Parameter an Literal
übergeben und sie mithilfe von Platzhaltern in gültigen PHP-Code formatieren lassen:
new Literal('substr(?, ?)', [$a, $b]);
// generiert beispielsweise: substr('hello', 5);
Ein Literal, das die Erstellung eines neuen Objekts darstellt, kann einfach mit der Methode new
generiert
werden:
Literal::new(Demo::class, [$a, 'foo' => $b]);
// generiert beispielsweise: new Demo(10, foo: 20)
Attribute
PHP 8-Attribute können zu allen Klassen, Methoden, Eigenschaften, Konstanten, Enums, Funktionen, Closures und Parametern hinzugefügt werden. Als Parameterwerte können auch Literale verwendet werden.
$class = new Nette\PhpGenerator\ClassType('Demo');
$class->addAttribute('Table', [
'name' => 'user',
'constraints' => [
Literal::new('UniqueConstraint', ['name' => 'ean', 'columns' => ['ean']]),
],
]);
$class->addProperty('list')
->addAttribute('Deprecated');
$method = $class->addMethod('count')
->addAttribute('Foo\Cached', ['mode' => true]);
$method->addParameter('items')
->addAttribute('Bar');
echo $class;
Ergebnis:
#[Table(name: 'user', constraints: [new UniqueConstraint(name: 'ean', columns: ['ean'])])]
class Demo
{
#[Deprecated]
public $list;
#[Foo\Cached(mode: true)]
public function count(
#[Bar]
$items,
) {
}
}
Property Hooks
Mit Property Hooks (repräsentiert durch die Klasse PropertyHook) können Sie Get- und Set-Operationen für Eigenschaften definieren, eine Funktion, die in PHP 8.4 eingeführt wurde:
$class = new Nette\PhpGenerator\ClassType('Demo');
$prop = $class->addProperty('firstName')
->setType('string');
$prop->addHook('set', 'strtolower($value)')
->addParameter('value')
->setType('string');
$prop->addHook('get')
->setBody('return ucfirst($this->firstName);');
echo $class;
Generiert:
class Demo
{
public string $firstName {
set(string $value) => strtolower($value);
get {
return ucfirst($this->firstName);
}
}
}
Eigenschaften und Property Hooks können abstrakt oder final sein:
$class->addProperty('id')
->setType('int')
->addHook('get')
->setAbstract();
$class->addProperty('role')
->setType('string')
->addHook('set', 'strtolower($value)')
->setFinal();
Asymmetrische Sichtbarkeit
PHP 8.4 führt asymmetrische Sichtbarkeit für Eigenschaften ein. Sie können unterschiedliche Zugriffsebenen für 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 sich die Sichtbarkeit auf das Lesen oder Schreiben der Eigenschaft bezieht. Der Standardmodus
ist 'get'
.
$class = new Nette\PhpGenerator\ClassType('Demo');
$class->addProperty('name')
->setType('string')
->setVisibility('public', 'private'); // public zum Lesen, private zum Schreiben
$class->addProperty('id')
->setType('int')
->setProtected('set'); // protected zum Schreiben
echo $class;
Generiert:
class Demo
{
public private(set) string $name;
protected(set) int $id;
}
Namensraum
Klassen, Eigenschaften, Schnittstellen und Enums (im Folgenden Klassen genannt) können in Namensräumen gruppiert werden, die durch die Klasse PhpNamespace repräsentiert werden:
$namespace = new Nette\PhpGenerator\PhpNamespace('Foo');
// neue Klassen im Namespace erstellen
$class = $namespace->addClass('Task');
$interface = $namespace->addInterface('Countable');
$trait = $namespace->addTrait('NameAware');
// oder eine existierende Klasse in den Namespace einfügen
$class = new Nette\PhpGenerator\ClassType('Task');
$namespace->add($class);
Wenn die Klasse bereits existiert, wird eine Ausnahme ausgelöst.
Sie können use-Klauseln definieren:
// use Http\Request;
$namespace->addUse(Http\Request::class);
// use Http\Request as HttpReq;
$namespace->addUse(Http\Request::class, 'HttpReq');
// use function iter\range;
$namespace->addUseFunction('iter\range');
Um den vollqualifizierten Namen einer Klasse, Funktion oder Konstante gemäß den definierten Aliasen zu vereinfachen,
verwenden Sie die Methode simplifyName
:
echo $namespace->simplifyName('Foo\Bar'); // 'Bar', da 'Foo' der aktuelle Namespace ist
echo $namespace->simplifyName('iter\range', $namespace::NameFunction); // 'range', aufgrund des definierten use-statements
Den vereinfachten Namen einer Klasse, Funktion oder Konstante können Sie umgekehrt mit der Methode resolveName
in
den vollqualifizierten Namen umwandeln:
echo $namespace->resolveName('Bar'); // 'Foo\Bar'
echo $namespace->resolveName('range', $namespace::NameFunction); // 'iter\range'
Übersetzungen von Klassennamen
Wenn eine Klasse Teil eines Namensraums ist, wird sie leicht unterschiedlich gerendert: Alle Typen (z. B. Typehints, Rückgabetypen, Name der Elternklasse, implementierte Schnittstellen, verwendete Eigenschaften und Attribute) werden automatisch übersetzt (wenn Sie dies nicht deaktivieren, siehe unten). Das bedeutet, dass Sie in den Definitionen vollständige Klassennamen verwenden müssen, und diese werden im resultierenden Code durch Aliase (gemäß den use-Klauseln) oder durch vollqualifizierte Namen ersetzt:
$namespace = new Nette\PhpGenerator\PhpNamespace('Foo');
$namespace->addUse('Bar\AliasedClass');
$class = $namespace->addClass('Demo');
$class->addImplement('Foo\A') // wird zu A vereinfacht
->addTrait('Bar\AliasedClass'); // wird zu AliasedClass vereinfacht
$method = $class->addMethod('method');
$method->addComment('@return ' . $namespace->simplifyType('Foo\D')); // in Kommentaren vereinfachen wir manuell
$method->addParameter('arg')
->setType('Bar\OtherClass'); // wird zu \Bar\OtherClass übersetzt
echo $namespace;
// oder verwenden Sie PsrPrinter für die Ausgabe gemäß PSR-2 / PSR-12 / PER
// echo (new Nette\PhpGenerator\PsrPrinter)->printNamespace($namespace);
Ergebnis:
namespace Foo;
use Bar\AliasedClass;
class Demo implements A
{
use AliasedClass;
/**
* @return D
*/
public function method(\Bar\OtherClass $arg)
{
}
}
Die automatische Übersetzung kann wie folgt deaktiviert werden:
$printer = new Nette\PhpGenerator\Printer; // oder PsrPrinter
$printer->setTypeResolving(false);
echo $printer->printNamespace($namespace);
PHP-Dateien
Klassen, Funktionen und Namensräume können in PHP-Dateien gruppiert werden, die durch die Klasse PhpFile repräsentiert werden:
$file = new Nette\PhpGenerator\PhpFile;
$file->addComment('Diese Datei wurde automatisch generiert.');
$file->setStrictTypes(); // fügt declare(strict_types=1) hinzu
$class = $file->addClass('Foo\A');
$function = $file->addFunction('Foo\foo');
// oder
// $namespace = $file->addNamespace('Foo');
// $class = $namespace->addClass('A');
// $function = $namespace->addFunction('foo');
echo $file;
// oder verwenden Sie PsrPrinter für die Ausgabe gemäß PSR-2 / PSR-12 / PER
// echo (new Nette\PhpGenerator\PsrPrinter)->printFile($file);
Ergebnis:
<?php
/**
* Diese Datei wurde automatisch generiert.
*/
declare(strict_types=1);
namespace Foo;
class A
{
}
function foo()
{
}
Warnung: Es ist nicht möglich, weiteren Code außerhalb von Funktionen und Klassen zu Dateien hinzuzufügen.
Generierung nach bestehenden Mustern
Neben der Modellierung von Klassen und Funktionen mit der oben beschriebenen API können Sie diese auch automatisch nach bestehenden Mustern generieren lassen:
// erstellt eine Klasse, die identisch mit der PDO-Klasse ist
$class = Nette\PhpGenerator\ClassType::from(PDO::class);
// erstellt eine Funktion, die identisch mit der trim()-Funktion ist
$function = Nette\PhpGenerator\GlobalFunction::from('trim');
// erstellt eine Closure nach der angegebenen
$closure = Nette\PhpGenerator\Closure::from(
function (stdClass $a, $b = null) {},
);
Die Körper von Funktionen und Methoden sind standardmäßig leer. Wenn Sie sie ebenfalls laden möchten, verwenden Sie diese
Methode (erfordert die Installation des Pakets nikic/php-parser
):
$class = Nette\PhpGenerator\ClassType::from(Foo::class, withBodies: true);
$function = Nette\PhpGenerator\GlobalFunction::from('foo', withBody: true);
Laden aus PHP-Dateien
Funktionen, Klassen, Schnittstellen und Enums können auch direkt aus einem String geladen werden, der PHP-Code enthält. Zum
Beispiel erstellen wir so ein ClassType
-Objekt:
$class = Nette\PhpGenerator\ClassType::fromCode(<<<XX
<?php
class Demo
{
public $foo;
}
XX);
Beim Laden von Klassen aus PHP-Code werden einzeilige Kommentare außerhalb von Methodenkörpern ignoriert (z. B. bei Properties usw.), da diese Bibliothek keine API zur Bearbeitung hat.
Sie können auch direkt eine gesamte PHP-Datei laden, die eine beliebige Anzahl von Klassen, Funktionen oder sogar Namensräumen enthalten kann:
$file = Nette\PhpGenerator\PhpFile::fromCode(file_get_contents('classes.php'));
Der einleitende Kommentar der Datei und die strict_types
-Deklaration werden ebenfalls geladen. Jeglicher andere
globale Code wird hingegen ignoriert.
Es ist erforderlich, dass nikic/php-parser
installiert ist.
Wenn Sie globalen Code in Dateien oder einzelne Anweisungen in Methodenkörpern manipulieren müssen, ist es
besser, direkt die Bibliothek nikic/php-parser
zu verwenden.
Class Manipulator
Die Klasse ClassManipulator bietet Werkzeuge zur Manipulation von Klassen.
$class = new Nette\PhpGenerator\ClassType('Demo');
$manipulator = new Nette\PhpGenerator\ClassManipulator($class);
Die Methode inheritMethod()
kopiert eine Methode aus einer Elternklasse oder einer implementierten Schnittstelle
in Ihre Klasse. Dies ermöglicht es Ihnen, die Methode zu überschreiben oder ihre Signatur zu erweitern:
$method = $manipulator->inheritMethod('bar');
$method->setBody('...');
```
Die Methode `inheritProperty()` kopiert eine Eigenschaft aus einer Elternklasse in Ihre Klasse. Dies ist nützlich, wenn Sie dieselbe Eigenschaft in Ihrer Klasse haben möchten, aber vielleicht mit einem anderen Standardwert:
```php
$property = $manipulator->inheritProperty('foo');
$property->setValue('new value');
Die Methode implement()
implementiert automatisch alle Methoden und Eigenschaften aus einer gegebenen
Schnittstelle oder abstrakten Klasse in Ihrer Klasse:
$manipulator->implement(SomeInterface::class);
// Jetzt implementiert Ihre Klasse SomeInterface und enthält alle seine Methoden
Ausgabe von Variablen
Die Klasse Dumper
konvertiert eine Variable in parsbaren PHP-Code. Sie liefert eine bessere und übersichtlichere
Ausgabe als die Standardfunktion var_export()
.
$dumper = new Nette\PhpGenerator\Dumper;
$var = ['a', 'b', 123];
echo $dumper->dump($var); // gibt ['a', 'b', 123] aus
Kompatibilitätstabelle
PhpGenerator 4.1 ist kompatibel mit PHP 8.0 bis 8.4.