Start · Sprachen · PHP · Referenz · Componere\Method

Componere\Method

Klasse

Repräsentiert eine zur Laufzeit dynamisch definierte Methode, die einer Klasse über die Componere-Extension hinzugefügt werden kann.

seit PHP 2.0.0 Kategorie: oop

Signatur

class Componere\Method

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');
Hallo, 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);
12

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