Signatur
Beschreibung
runkit7_method_rename() gehört zur Runkit7-PECL-Erweiterung und ermöglicht es, den Namen einer vorhandenen Methode in einer Klasse während der Ausführung zu ändern. Die Implementierung (der Methodenrumpf) bleibt dabei vollständig erhalten – lediglich der Name, unter dem die Methode erreichbar ist, wird ausgetauscht.
Typische Anwendungsfälle sind Unit-Tests, bei denen eine Methode temporär umbenannt wird, um Platz für eine Test-Stub-Methode zu schaffen, sowie dynamische Metaprogrammierung, bei der Klassen zur Laufzeit angepasst werden müssen. In Kombination mit runkit7_method_add() lassen sich so vollständige Method-Swapping-Muster realisieren.
Die Funktion arbeitet direkt auf der Zend-Engine-Ebene und wirkt sich unmittelbar auf alle folgenden Aufrufe der Methode aus – sowohl auf neue als auch auf bereits instanziierte Objekte der betroffenen Klasse. Sie kann nicht auf interne PHP-Klassen angewendet werden, da diese in der Regel durch die Engine geschützt sind.
Hinweis: Runkit7 ist eine eigenständige PECL-Erweiterung und muss separat installiert werden. Sie ist nicht im Standard-PHP-Paket enthalten. Der Einsatz in Produktionsumgebungen wird im Allgemeinen nicht empfohlen; die Erweiterung ist primär für Entwicklungs- und Testszwecke gedacht.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $class_name Pflicht | string | Der Name der Klasse, deren Methode umbenannt werden soll. Muss eine bereits definierte Nutzerklasse sein. | |
| $source_method_name Pflicht | string | Der aktuelle (alte) Name der Methode, die umbenannt werden soll. | |
| $dest_method_name Pflicht | string | Der neue Name, unter dem die Methode nach dem Umbenennen erreichbar ist. Darf in der Klasse noch nicht existieren. |
Rückgabewert
true zurück, wenn die Methode erfolgreich umbenannt wurde. Im Fehlerfall (z. B. Klasse nicht gefunden, Quellmethode existiert nicht oder Zielname bereits vergeben) wird false zurückgegeben.Beispiele
Einfaches Umbenennen einer Methode
<?php
class Greeter {
public function sayHello(): string {
return 'Hallo, Welt!';
}
}
$obj = new Greeter();
echo $obj->sayHello() . PHP_EOL; // Hallo, Welt!
// Methode umbenennen
runkit7_method_rename('Greeter', 'sayHello', 'greet');
// Jetzt ist sayHello nicht mehr verfügbar, stattdessen greet()
$obj2 = new Greeter();
echo $obj2->greet() . PHP_EOL; // Hallo, Welt!
Method-Swapping-Muster im Unit-Test
<?php
class Calculator {
public function multiply(int $a, int $b): int {
return $a * $b;
}
}
// Originalmethode sichern (umbenennen), dann Stub hinzufügen
runkit7_method_rename('Calculator', 'multiply', 'multiply_orig');
runkit7_method_add(
'Calculator',
'multiply',
'$a, $b',
'return 42; // Stub für Tests'
);
$calc = new Calculator();
echo $calc->multiply(3, 5) . PHP_EOL; // 42 (Stub)
// Original wiederherstellen
runkit7_method_remove('Calculator', 'multiply');
runkit7_method_rename('Calculator', 'multiply_orig', 'multiply');
echo $calc->multiply(3, 5) . PHP_EOL; // 15 (Original)
// Wichtig · Fallstricke
Vorsicht: Das Umbenennen von Methoden zur Laufzeit kann zu schwer nachvollziehbaren Fehlern führen, wenn andere Teile des Codes (z. B. Traits, Vererbungshierarchien oder Reflection) noch den alten Namen verwenden. Nach einem Rename sind Referenzen auf den alten Methodennamen ungültig.
Die Funktion funktioniert nicht auf internen PHP-Klassen (z. B. ArrayObject, PDO etc.), da diese durch die Zend-Engine geschützt sind. Versuche führen zu einem Fehler.
Im Produktionseinsatz sollte Runkit7 grundsätzlich vermieden werden. Für Produktionsanpassungen sind Design Patterns wie Decorator oder Proxy die bessere Alternative.