Start · Sprachen · PHP · Referenz · uopz_function

uopz_function

Funktion

Erzeugt oder überschreibt eine benannte PHP-Funktion zur Laufzeit mittels einer <code>Closure</code>.

seit PHP 2.0.2 Kategorie: misc

Signatur

uopz_function(string $function, Closure $handler): bool

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

Typ
bool
Beschreibung
Gibt 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!
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
1700000000

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