Start · Sprachen · PHP · Referenz · Componere\Abstract\Definition

Componere\Abstract\Definition

Klasse

Repräsentiert die zur Laufzeit erstellte Definition einer abstrakten Klasse innerhalb der Componere-Extension.

seit PHP 2.0.0 Kategorie: oop

Signatur

abstract class Componere\Abstract\Definition extends Componere\Definition

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!
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';
Abstrakt: ja Implementiert Speakable: ja

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