Signatur
Beschreibung
runkit7_method_add ist Teil der runkit7-PECL-Erweiterung und erlaubt es, einer bereits definierten Klasse dynamisch eine neue Methode hinzuzufügen. Die Methode wird dabei als PHP-Code-String übergeben, was maximale Flexibilität bei der Laufzeit-Manipulation von Klassen ermöglicht.
Typische Einsatzgebiete sind Unit-Tests, bei denen Klassen temporär um Test-Helfer-Methoden erweitert werden müssen, sowie Plugin- oder Hook-Systeme, die zur Laufzeit Verhalten in vorhandene Klassen einbetten sollen. Auch für Prototyping oder das nachträgliche Hinzufügen von Verhalten in Legacy-Systemen ohne Zugriff auf den Quellcode ist die Funktion nützlich.
Der Parameter $flags steuert die Sichtbarkeit (RUNKIT7_ACC_PUBLIC, RUNKIT7_ACC_PROTECTED, RUNKIT7_ACC_PRIVATE) und ob die Methode statisch sein soll (RUNKIT7_ACC_STATIC). Die Flags können mit dem bitweisen ODER-Operator kombiniert werden.
Achtung: Die Funktion setzt die Installation der runkit7-PECL-Erweiterung voraus. Produktiver Einsatz sollte mit Bedacht erfolgen, da dynamische Klassen-Manipulationen die Lesbarkeit und Wartbarkeit von Code erheblich verschlechtern können.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $class_name Pflicht | string | Der Name der bestehenden Klasse, der die Methode hinzugefügt werden soll. | |
| $method_name Pflicht | string | Der Name der neuen Methode, die zur Klasse hinzugefügt wird. | |
| $args Pflicht | string | Die Parameterliste der neuen Methode als String, z. B. '$a, $b'. Bei keinen Parametern einen leeren String übergeben. |
|
| $code Pflicht | string | Der PHP-Code-Body der neuen Methode als String, ohne umschließende geschweifte Klammern. Beispiel: 'return $a + $b;' |
|
| $flags | int | RUNKIT7_ACC_PUBLIC | Zugriffsmodifikator und weitere Eigenschaften der Methode. Mögliche Werte: RUNKIT7_ACC_PUBLIC, RUNKIT7_ACC_PROTECTED, RUNKIT7_ACC_PRIVATE, RUNKIT7_ACC_STATIC. Flags können per | kombiniert werden. |
| $doc_comment | ?string | null | Optionaler DocBlock-Kommentar für die neue Methode als String. |
| $return_type | string | Optionaler Rückgabetyp der neuen Methode als String, z. B. 'int' oder 'string'. |
|
| $is_strict | bool | false | Gibt an, ob die Methode im strikten Modus (declare(strict_types=1)) ausgeführt werden soll. |
Rückgabewert
true zurück, wenn die Methode erfolgreich hinzugefügt wurde, oder false, wenn ein Fehler aufgetreten ist (z. B. Klasse nicht vorhanden, Methode bereits definiert).Beispiele
Einfache Methode zur Laufzeit hinzufügen
<?php
class Rechner {
public int $wert;
public function __construct(int $wert) {
$this->wert = $wert;
}
}
// Neue Methode 'verdoppeln' zur Klasse hinzufügen
runkit7_method_add(
'Rechner',
'verdoppeln',
'',
'return $this->wert * 2;',
RUNKIT7_ACC_PUBLIC
);
$r = new Rechner(5);
echo $r->verdoppeln(); // 10
Statische Methode mit Parametern hinzufügen
<?php
class MathHelper {}
runkit7_method_add(
'MathHelper',
'addiere',
'$a, $b',
'return $a + $b;',
RUNKIT7_ACC_PUBLIC | RUNKIT7_ACC_STATIC
);
echo MathHelper::addiere(3, 7); // 10
Methode mit Fehlerbehandlung hinzufügen
<?php
class BeispielKlasse {
public function vorhandeneMethode(): string {
return 'vorhanden';
}
}
$erfolg = runkit7_method_add(
'BeispielKlasse',
'neueMethode',
'$name',
'return "Hallo, " . $name . "!";',
RUNKIT7_ACC_PUBLIC
);
if ($erfolg) {
$obj = new BeispielKlasse();
echo $obj->neueMethode('Welt');
} else {
echo 'Methode konnte nicht hinzugefügt werden.';
}
// Wichtig · Fallstricke
Voraussetzung: Die runkit7-Erweiterung muss installiert und in der php.ini aktiviert sein (extension=runkit7). Zudem muss runkit7.internal_override in der php.ini auf 1 gesetzt sein, wenn interne PHP-Klassen manipuliert werden sollen.
Sicherheitsrisiko: Da der Methoden-Code als String übergeben wird, besteht bei unsachgemäßer Verwendung mit benutzerkontrollierten Eingaben ein erhebliches Code-Injection-Risiko. Der Code-String sollte niemals aus ungeprüften externen Quellen stammen.
Es ist nicht möglich, eine Methode hinzuzufügen, die in der Klasse bereits existiert. In diesem Fall muss zuerst runkit7_method_remove aufgerufen werden. Für bestehende Methoden empfiehlt sich runkit7_method_redefine.
Der Einsatz in Produktivsystemen wird generell nicht empfohlen. Die Funktion eignet sich primär für Test-Umgebungen und Prototypen. PHP-Opcache kann mit dynamisch manipulierten Klassen in Konflikt geraten.