Signatur
Beschreibung
Componere\Method ist Bestandteil der Componere-Extension und erlaubt es, PHP-Methoden vollständig zur Laufzeit zu definieren. Eine Method-Instanz nimmt eine Closure entgegen und kann anschließend über Componere\Definition oder Componere\Patch einer bestehenden oder neuen Klasse hinzugefügt werden.
Der Hauptanwendungsfall ist das nachträgliche Erweitern oder Überschreiben von Klassen, ohne deren Quellcode zu ändern – etwa in Frameworks, Test-Doubles oder Plugin-Systemen. Dies ermöglicht eine metaprogrammatische Arbeitsweise, die mit regulärem PHP-OOP nicht möglich wäre.
Eine Method kann als abstrakt, final, static sowie mit unterschiedlichen Sichtbarkeiten (public, protected, private) konfiguriert werden. Die zugrunde liegende Closure übernimmt dabei die Rolle des Methodenkörpers und erhält über $this Zugriff auf das Objekt, dem die Methode zugeordnet wird.
Wichtig: Componere ist eine PECL-Extension und nicht Teil des PHP-Kerns. Sie muss separat installiert werden und ist primär für fortgeschrittene Szenarien wie Runtime-Patching, AOP-ähnliche Konzepte oder dynamische Proxy-Generierung gedacht.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $closure Pflicht | Closure | Die Closure, die den Methodenkörper definiert. $this innerhalb der Closure verweist auf das Objekt der Zielklasse, sobald die Methode gebunden ist. |
Beispiele
Methode zur Laufzeit zu einer Klasse hinzufügen
<?php
use Componere\Definition;
use Componere\Method;
class Greeter {}
$def = new Definition(Greeter::class);
$def->addMethod('hello', new Method(function(string $name): string {
return "Hallo, {$name}!";
}));
$def->register();
$g = new Greeter();
echo $g->hello('Welt');
Methode als protected und final markieren
<?php
use Componere\Definition;
use Componere\Method;
class BaseService {}
$def = new Definition(BaseService::class);
$method = new Method(function(): string {
return 'interner Wert';
});
$method->setProtected();
$method->setFinal();
$def->addMethod('getInternalValue', $method);
$def->register();
// Die Methode ist jetzt protected und final in BaseService
Bestehende Methode per Patch überschreiben
<?php
use Componere\Patch;
use Componere\Method;
class Calculator {
public function multiply(int $a, int $b): int {
return $a * $b;
}
}
$calc = new Calculator();
$patch = new Patch($calc);
$patch->addMethod('multiply', new Method(function(int $a, int $b): int {
// Überschriebene Implementierung: quadratischer Trick
return (int)(($a + $b) ** 2 / 4 - (($a - $b) ** 2) / 4);
}));
$patch->apply();
echo $calc->multiply(3, 4);
// Wichtig · Fallstricke
Sichtbarkeits-Methoden: Componere\Method bietet folgende Methoden zur Konfiguration: setPublic(), setProtected(), setPrivate(), setStatic(), setAbstract() sowie setFinal(). Diese können beliebig kombiniert werden (sofern PHP-kompatibel).
Binding: Die übergebene Closure wird beim Hinzufügen zur Klasse automatisch an deren Scope gebunden. Pfeilfunktionen (fn()) werden nicht unterstützt, da sie keinen eigenen $this-Kontext besitzen.
Kompatibilität: Componere erfordert PHP 7+ und eine separate Installation via PECL (pecl install componere). Sie ist nicht für den produktiven Einsatz in sicherheitskritischen Umgebungen gedacht, da das Überschreiben von Klassen zur Laufzeit die Code-Nachvollziehbarkeit erheblich reduzieren kann.