Signatur
Beschreibung
uopz_set_return gehört zur uopz-Extension (User Operations for Zend) und erlaubt es, zur Laufzeit den Rückgabewert einer beliebigen Funktion oder Methode zu überschreiben. Dies ist besonders in Unit-Tests nützlich, um externe Abhängigkeiten (z. B. Datenbankabfragen, Dateisystemzugriffe oder Zeit-Funktionen) zu mocken, ohne die eigentliche Quellstruktur zu verändern.
Wird als $value eine Closure übergeben und $execute auf true gesetzt, wird die Closure bei jedem Aufruf der Zielfunktion ausgeführt und ihr Rückgabewert verwendet – die Closure agiert also als vollständiger Ersatz der Original-Implementierung. Ohne $execute = true wird die Closure selbst (als Objekt) zurückgegeben, nicht ausgeführt.
Für Methoden existiert eine zweite Signatur: uopz_set_return(string $class, string $function, mixed $value, bool $execute = false). So können auch Instanz- und statische Methoden beliebiger Klassen überschrieben werden.
Der gesetzte Rückgabewert bleibt für die gesamte Laufzeit des Skripts aktiv, bis er mit uopz_unset_return wieder entfernt wird. Die Funktion ist ausschließlich für Entwicklungs- und Testumgebungen gedacht und sollte niemals in Produktivsystemen eingesetzt werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $class | string | Optionaler Klassenname, wenn eine Methode statt einer globalen Funktion überschrieben werden soll. | |
| $function Pflicht | string | Name der Funktion oder Methode, deren Rückgabewert überschrieben werden soll. | |
| $value Pflicht | mixed | Der Wert, der künftig von der Funktion zurückgegeben wird. Wird eine Closure übergeben und $execute auf true gesetzt, wird die Closure als Ersatz-Implementierung ausgeführt. |
|
| $execute | bool | false | Wenn true und $value eine Closure ist, wird diese bei jedem Aufruf der Zielfunktion ausgeführt und ihr Rückgabewert verwendet. |
Rückgabewert
true zurück, wenn der Rückgabewert erfolgreich gesetzt wurde, andernfalls false (z. B. wenn die Funktion nicht existiert).Beispiele
Einfachen Rückgabewert für eine globale Funktion mocken
<?php
// time() soll im Test immer denselben Wert liefern
uopz_set_return('time', 1700000000);
echo time(); // Gibt immer 1700000000 aus, unabhängig von der echten Zeit
// Mock wieder entfernen
uopz_unset_return('time');
Closure als Ersatz-Implementierung für eine Methode verwenden
<?php
class Database {
public function fetchUser(int $id): array {
// Würde normalerweise eine echte DB-Abfrage ausführen
return [];
}
}
// Methode mit einer Closure mocken (execute = true)
uopz_set_return(
Database::class,
'fetchUser',
function(int $id): array {
return ['id' => $id, 'name' => 'Test-Nutzer'];
},
true
);
$db = new Database();
$user = $db->fetchUser(42);
echo $user['name']; // Gibt 'Test-Nutzer' aus
uopz_unset_return(Database::class, 'fetchUser');
// Wichtig · Fallstricke
Achtung: uopz_set_return ist ausschließlich für Test- und Entwicklungsumgebungen geeignet. Der Einsatz in Produktionssystemen kann zu unvorhersehbarem Verhalten und schwer nachvollziehbaren Bugs führen.
Die uopz-Extension muss explizit installiert und in der php.ini aktiviert sein (extension=uopz). Ab PHP 7 ist uopz >= 5.0.0 erforderlich. Ab uopz 6.0.0 ist die Konfigurationsoption uopz.disable verfügbar, mit der die Extension global deaktiviert werden kann.
Wird $execute = false verwendet und als $value eine Closure übergeben, gibt die gemockte Funktion das Closure-Objekt selbst zurück – dies ist oft ein unbeabsichtigter Fehler. Im Zweifelsfall sollte $execute = true explizit gesetzt werden.