Start · Sprachen · PHP · Referenz · uopz_set_return

uopz_set_return

Funktion

Setzt einen festen Rückgabewert (oder eine Closure als Ersatz-Implementierung) für eine bestehende PHP-Funktion oder Methode.

seit PHP 5.0.0 Kategorie: misc

Signatur

uopz_set_return(string $function, mixed $value, bool $execute = false): bool

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

Typ
bool
Beschreibung
Gibt 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');
1700000000

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');
Test-Nutzer

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