Start · Sprachen · PHP · Referenz · runkit7_method_remove

runkit7_method_remove

Funktion

Entfernt eine Methode einer Klasse zur Laufzeit aus der PHP-Laufzeitumgebung.

Kategorie: misc

Signatur

runkit7_method_remove(string $class_name, string $method_name): bool

Beschreibung

runkit7_method_remove() ist Teil der Runkit7-Extension und ermöglicht es, eine bestehende Methode einer Klasse zur Laufzeit vollständig zu entfernen. Nach dem Aufruf ist die Methode für alle nachfolgenden Instanziierungen und auch für bereits existierende Objekte dieser Klasse nicht mehr verfügbar.

Die Funktion ist typischerweise in Test- und Mocking-Szenarien nützlich, wenn Methoden dynamisch entfernt werden müssen, ohne den Quellcode zu verändern – etwa um das Fehlen einer Methode in Integrationstests zu simulieren oder um Klassen-Verhalten zur Laufzeit anzupassen.

Hinweis: Runkit7 ist eine PECL-Extension und muss separat installiert werden. Die PHP-Konfigurationsoption runkit.internal_override muss aktiviert sein, wenn interne PHP-Klassen manipuliert werden sollen.

Das Entfernen von Methoden aus laufenden Systemen ist riskant und sollte ausschließlich in kontrollierten Umgebungen wie Unit-Tests oder Entwicklungsumgebungen eingesetzt werden – niemals in produktivem Code.

Parameter

Name Typ Default Beschreibung
$class_name Pflicht string Der Name der Klasse, aus der die Methode entfernt werden soll.
$method_name Pflicht string Der Name der Methode, die aus der Klasse entfernt werden soll.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, oder false wenn die Methode nicht gefunden wurde oder das Entfernen fehlschlug.

Beispiele

Methode einer Klasse zur Laufzeit entfernen

<?php
class MeineKlasse
{
    public function hallo(): string
    {
        return 'Hallo Welt!';
    }

    public function tschuess(): string
    {
        return 'Tschüss!';
    }
}

$obj = new MeineKlasse();
echo $obj->hallo();   // Hallo Welt!

// Methode zur Laufzeit entfernen
runkit7_method_remove('MeineKlasse', 'hallo');

// Diese Methode existiert nun nicht mehr
$obj2 = new MeineKlasse();
try {
    $obj2->hallo();
} catch (Error $e) {
    echo 'Fehler: ' . $e->getMessage();
}
Hallo Welt! Fehler: Call to undefined method MeineKlasse::hallo()

Einsatz in einem Test-Szenario

<?php
class Datenbankzugriff
{
    public function verbinde(): bool
    {
        // Echte Datenbankverbindung
        return true;
    }

    public function trenne(): void
    {
        // Verbindung trennen
    }
}

// In einem Test: 'trenne'-Methode entfernen, um Fehlerfall zu simulieren
$entfernt = runkit7_method_remove('Datenbankzugriff', 'trenne');
var_dump($entfernt);

$db = new Datenbankzugriff();
var_dump(method_exists($db, 'trenne'));
bool(true) bool(false)

// Wichtig · Fallstricke

Sicherheit und Stabilität: Das Entfernen von Methoden zur Laufzeit kann zu schwer nachvollziehbaren Fehlern führen, insbesondere wenn andere Teile des Codes die betroffene Methode noch aufrufen. Der Einsatz sollte auf Testumgebungen beschränkt bleiben.

Runkit7 funktioniert nicht mit statisch kompilierten Binaries oder unter bestimmten OPcache-Konfigurationen. Für interne PHP-Klassen (z. B. PDO, DateTime) ist die INI-Einstellung runkit.internal_override = 1 erforderlich.

Die Funktion steht nur zur Verfügung, wenn die runkit7-Extension über PECL installiert und in der php.ini geladen ist.