Signatur
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
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');
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');
// 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.