Start · Sprachen · PHP · Referenz · runkit7_method_add

runkit7_method_add

Funktion

Fügt einer bestehenden Klasse zur Laufzeit eine neue Methode hinzu, ohne die Quelldatei zu verändern.

Kategorie: misc

Signatur

runkit7_method_add(string $class_name, string $method_name, string $args, string $code, int $flags = RUNKIT7_ACC_PUBLIC, ?string $doc_comment = null, string $return_type = '', bool $is_strict = false): bool

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

Typ
bool
Beschreibung
Gibt 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
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
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.';
}
Hallo, Welt!

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