Signatur
Beschreibung
uopz_function ist Teil der UOPZ-Erweiterung (User Operations for Zend) und ermöglicht es, zur Laufzeit eine neue globale PHP-Funktion zu definieren oder eine bestehende Funktion durch eine Closure zu ersetzen. Dies geschieht auf Ebene des Zend-Opcode-Caches und ist daher besonders für Unit-Tests, Mocking-Frameworks oder dynamisches Patching von Funktionen nützlich.
Der erste Parameter $function bestimmt den Namen der zu erzeugenden oder überschreibenden Funktion. Der zweite Parameter $handler ist eine Closure, die als Implementierung der Funktion dient. Die Signatur der Closure sollte dabei der gewünschten Schnittstelle der Funktion entsprechen.
Im Gegensatz zu runkit_function_redefine oder override_function arbeitet UOPZ direkt im Opcode-Cache und ist damit schneller sowie kompatibler mit aktuellen PHP-Versionen. Die Änderungen gelten nur für die Laufzeit des aktuellen Requests bzw. Prozesses und werden nicht persistent gespeichert.
Achtung: uopz_function sollte ausschließlich in Entwicklungs- und Testumgebungen eingesetzt werden. Der Einsatz im Produktionsbetrieb kann zu unvorhergesehenen Seiteneffekten führen, da interne Optimierungen und Caching-Mechanismen von PHP umgangen werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $function Pflicht | string | Der Name der zu erzeugenden oder zu überschreibenden globalen Funktion. | |
| $handler Pflicht | Closure | Eine Closure, die als neue Implementierung der Funktion verwendet wird. Ihre Signatur sollte der gewünschten Funktionsschnittstelle entsprechen. |
Rückgabewert
true zurück, wenn die Funktion erfolgreich erstellt oder ersetzt wurde, andernfalls false.Beispiele
Neue Funktion zur Laufzeit definieren
<?php
// Voraussetzung: UOPZ-Erweiterung ist installiert und aktiviert
// Eine neue Funktion 'greet' zur Laufzeit erzeugen
uopz_function('greet', function(string $name): string {
return 'Hallo, ' . $name . '!';
});
echo greet('Welt'); // Hallo, Welt!
Bestehende Funktion für Tests überschreiben
<?php
// Voraussetzung: UOPZ-Erweiterung ist installiert und aktiviert
// Die eingebaute Funktion 'time' für deterministisches Testen überschreiben
uopz_function('time', function(): int {
return 1700000000; // fester Zeitstempel für reproduzierbare Tests
});
echo time(); // Gibt immer 1700000000 zurück
// Nach dem Test kann die Originalfunktion mit uopz_unset_function wiederhergestellt werden
uopz_unset_function('time');
echo time(); // Gibt nun wieder den echten Unix-Zeitstempel zurück
// Wichtig · Fallstricke
Nur für Entwicklung/Tests geeignet: uopz_function sollte niemals in Produktionsumgebungen eingesetzt werden, da es das normale Verhalten von PHP-Funktionen verändert und schwer nachvollziehbare Fehler verursachen kann.
Die UOPZ-Erweiterung muss explizit installiert und in der php.ini aktiviert werden (extension=uopz). Sie ist nicht standardmäßig in PHP enthalten. Ab UOPZ Version 5 hat sich die API teilweise geändert – insbesondere für Methoden (uopz_set_return und verwandte Funktionen sind zu bevorzugen).
Überschriebene Funktionen bleiben für die gesamte Lebensdauer des PHP-Prozesses aktiv, sofern sie nicht explizit mit uopz_unset_function zurückgesetzt werden. In CLI-Skripten und Test-Suites mit Prozess-Isolation ist dies in der Regel unproblematisch.