Signatur
Beschreibung
Componere\Abstract\Definition ist Teil der Componere PHP-Extension und ermöglicht es, zur Laufzeit neue abstrakte Klassen zu definieren. Sie erweitert Componere\Definition und verhält sich analog dazu, erzeugt jedoch eine abstrakte Klasse, die nicht direkt instanziiert werden kann.
Die Klasse wird typischerweise eingesetzt, wenn man zur Laufzeit eine abstrakte Basisklasse definieren möchte, von der andere (ebenfalls zur Laufzeit erstellte oder bereits bestehende) Klassen erben können. Dies ist besonders nützlich in Frameworks, Proxygeneratoren und Test-Doubles, die flexible Klassenhierarchien ohne Codegenerierung auf Dateiebene aufbauen müssen.
Wie bei Componere\Definition können der neuen abstrakten Klasse über Methoden wie addMethod(), addTrait(), addInterface() und addConstant() Methoden, Traits, Interfaces und Konstanten hinzugefügt werden. Nach dem Aufruf von register() steht die abstrakte Klasse im globalen Namensraum zur Verfügung.
Hinweis: Die Componere-Extension ist keine Standard-PHP-Extension und muss separat installiert werden (z. B. via PECL). Für Produktionssysteme sollte der Einsatz sorgfältig abgewogen werden, da das Manipulieren von Klassen zur Laufzeit die Wartbarkeit erschweren kann.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $name Pflicht | string | Der vollständige Name (inkl. Namespace) der neuen abstrakten Klasse, die zur Laufzeit definiert werden soll. | |
| $parent | string | Optionaler Name einer bereits bestehenden Elternklasse, von der die neue abstrakte Klasse erben soll. | |
| $interfaces | array | [] | Optionales Array von Interface-Namen, die die neue abstrakte Klasse implementieren soll. |
Beispiele
Abstrakte Klasse zur Laufzeit definieren und registrieren
<?php
// Voraussetzung: Componere-Extension ist installiert
use Componere\Abstract\Definition;
use Componere\Method;
// Neue abstrakte Klasse 'AbstractAnimal' definieren
$definition = new Definition('AbstractAnimal');
// Abstrakte Methode hinzufügen (ohne Implementierung)
$definition->addMethod('speak', new Method(function(): string {
return '';
}));
// Klasse registrieren – ab jetzt im globalen Namensraum verfügbar
$definition->register();
// Konkrete Unterklasse definieren, die von AbstractAnimal erbt
$dogDefinition = new \Componere\Definition('Dog', 'AbstractAnimal');
$dogDefinition->addMethod('speak', new Method(function(): string {
return 'Wuff!';
}));
$dogDefinition->register();
$dog = new Dog();
echo $dog->speak(); // Wuff!
Abstrakte Klasse mit Interface zur Laufzeit erstellen
<?php
use Componere\Abstract\Definition;
use Componere\Method;
interface Speakable {
public function speak(): string;
}
// Abstrakte Klasse, die das Interface 'Speakable' implementiert
$definition = new Definition('AbstractSpeaker', '', ['Speakable']);
$definition->addMethod('speak', new Method(function(): string {
return '';
}));
$definition->register();
// Prüfen ob die abstrakte Klasse das Interface implementiert
$reflection = new ReflectionClass('AbstractSpeaker');
echo $reflection->isAbstract() ? 'Abstrakt: ja' : 'Abstrakt: nein';
echo PHP_EOL;
echo $reflection->implementsInterface('Speakable') ? 'Implementiert Speakable: ja' : 'Implementiert Speakable: nein';
// Wichtig · Fallstricke
Installationsvoraussetzung: Componere\Abstract\Definition ist Teil der Componere PECL-Extension und steht nicht in einer Standard-PHP-Installation zur Verfügung. Die Extension muss über PECL oder manuell kompiliert installiert werden.
Registrierung ist endgültig: Sobald register() aufgerufen wurde, kann die Klasse nicht mehr verändert werden. Versuche, eine bereits registrierte Definition erneut zu registrieren, führen zu einem Fehler.
Kompatibilität: Die Extension setzt voraus, dass der Klassenname zur Zeit der Registrierung noch nicht vergeben ist. Das Überschreiben bestehender Klassen ist mit Componere\Patch möglich, nicht mit Definition.