Start · Sprachen · PHP · Referenz · uopz_set_hook

uopz_set_hook

Funktion

Setzt einen Hook (Closure), der beim Betreten einer Funktion oder Methode automatisch ausgeführt wird.

seit PHP 5.0.0 Kategorie: misc

Signatur

uopz_set_hook(string $function, Closure $hook): bool

Beschreibung

uopz_set_hook() gehört zur uopz-Extension (User Operations for Zend) und ermöglicht es, eine beliebige Funktion oder Methode mit einem Hook zu versehen. Dieser Hook wird als Closure übergeben und jedes Mal aufgerufen, wenn die betroffene Funktion betreten wird — noch bevor der eigentliche Funktionskörper ausgeführt wird.

Typische Einsatzgebiete sind Unit-Tests, Mocking, Debugging und das nachträgliche Instrumentieren von Code ohne dessen Quelltext zu ändern. So lässt sich z. B. das Verhalten von PHP-Kern- oder Third-Party-Funktionen zur Laufzeit beobachten oder protokollieren.

Für Methoden einer Klasse steht die Überladung uopz_set_hook(string $class, string $function, Closure $hook) zur Verfügung, bei der als erstes Argument der Klassenname angegeben wird.

Wichtig: Die Hooks bleiben aktiv, bis sie mit uopz_unset_hook() entfernt oder das Skript beendet wird. Die uopz-Extension ist primär für Test- und Entwicklungsumgebungen gedacht und sollte nicht in Produktionssystemen eingesetzt werden.

Parameter

Name Typ Default Beschreibung
$class string Optionaler Klassenname, wenn der Hook für eine Methode gesetzt werden soll. Wird dieser Parameter angegeben, verschiebt sich die Parameterliste: uopz_set_hook(string $class, string $function, Closure $hook).
$function Pflicht string Name der Funktion oder Methode, die mit dem Hook versehen werden soll.
$hook Pflicht Closure Die Closure, die beim Betreten der Zielfunktion ausgeführt wird. Sie wird im Kontext der betroffenen Funktion aufgerufen, hat also Zugriff auf $this (bei Methoden) und die übergebenen Argumente.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, false wenn der Hook nicht gesetzt werden konnte (z. B. wenn die angegebene Funktion oder Methode nicht existiert).

Beispiele

Hook auf eine globale Funktion setzen

<?php
// Hook auf die eingebaute Funktion strlen() setzen
uopz_set_hook('strlen', function() {
    echo "strlen() wurde aufgerufen mit: " . func_get_arg(0) . PHP_EOL;
});

$result = strlen('Hallo Welt');
echo "Ergebnis: " . $result . PHP_EOL;

// Hook wieder entfernen
uopz_unset_hook('strlen');
strlen() wurde aufgerufen mit: Hallo Welt Ergebnis: 10

Hook auf eine Klassenmethode setzen

<?php
class Benutzer {
    public function speichern(string $name): string {
        return "Benutzer '{$name}' gespeichert.";
    }
}

// Hook für die Methode Benutzer::speichern() registrieren
uopz_set_hook('Benutzer', 'speichern', function() {
    $args = func_get_args();
    echo "[LOG] speichern() aufgerufen mit: " . ($args[0] ?? '(kein Argument)') . PHP_EOL;
});

$b = new Benutzer();
$result = $b->speichern('Max Mustermann');
echo $result . PHP_EOL;

// Hook wieder entfernen
uopz_unset_hook('Benutzer', 'speichern');
[LOG] speichern() aufgerufen mit: Max Mustermann Benutzer 'Max Mustermann' gespeichert.

// Wichtig · Fallstricke

Nur für Entwicklung und Tests: Die uopz-Extension manipuliert den Zend-VM-Opcode-Cache und ist nicht für den produktiven Betrieb ausgelegt. In Produktionssystemen kann ihr Einsatz zu unvorhersehbarem Verhalten, Sicherheitslücken oder Performanceproblemen führen.

Der Hook ersetzt nicht die Originalfunktion — er wird zusätzlich davor ausgeführt. Soll die Originalfunktion ersetzt werden, ist uopz_set_return() die richtige Wahl.

Hooks auf interne PHP-Funktionen (wie strlen, array_map etc.) sind möglich, aber Vorsicht ist geboten: Endlosrekursionen oder unerwartete Seiteneffekte können auftreten, wenn der Hook selbst die gehookte Funktion aufruft.