Start · Sprachen · PHP · Referenz · stream_wrapper_restore

stream_wrapper_restore

Funktion

Stellt einen zuvor mit <code>stream_wrapper_unregister()</code> entfernten eingebauten PHP-Wrapper für das angegebene Protokoll wieder her.

seit PHP 5.1.0 Kategorie: io

Signatur

stream_wrapper_restore(string $protocol): bool

Beschreibung

stream_wrapper_restore() wird verwendet, um einen eingebauten PHP-Stream-Wrapper (z. B. file://, http://, ftp://) wiederherzustellen, nachdem er zuvor mit stream_wrapper_unregister() deregistriert wurde. Dies ist vor allem in Testszenarien oder bei Monkey-Patching hilfreich, wenn man einen Wrapper temporär durch eine eigene Implementierung ersetzen und danach wieder den Original-Wrapper aktivieren möchte.

Ein typisches Einsatzszenario ist das temporäre Überschreiben des file://-Wrappers in Unit-Tests, um Dateisystemoperationen zu mocken. Nach dem Test stellt stream_wrapper_restore() sicher, dass der ursprüngliche Wrapper wieder verfügbar ist und normale Dateioperationen wieder funktionieren.

Die Funktion gibt false zurück und erzeugt eine Warnung, wenn der angegebene Protokoll-Name kein bekannter eingebauter PHP-Wrapper ist oder wenn der Wrapper noch nicht deregistriert wurde (also noch aktiv ist).

Parameter

Name Typ Default Beschreibung
$protocol Pflicht string Der Name des Protokolls/Wrappers, der wiederhergestellt werden soll, z. B. "file", "http" oder "ftp" — ohne Doppelpunkte oder Slashes.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Wrapper erfolgreich wiederhergestellt wurde. Gibt false zurück und erzeugt eine E_NOTICE-Warnung, wenn das Protokoll kein eingebauter PHP-Wrapper ist oder nicht deregistriert war.

Beispiele

Datei-Wrapper temporär ersetzen und wiederherstellen

<?php
// Eigene Wrapper-Klasse als Ersatz für den file://-Wrapper
class MockFileWrapper {
    public function stream_open(string $path, string $mode, int $options, ?string &$opened_path): bool {
        // Simulierte Implementierung
        return true;
    }
    // ... weitere Methoden
}

// Eingebauten file://-Wrapper deregistrieren
stream_wrapper_unregister('file');

// Eigenen Mock-Wrapper registrieren
stream_wrapper_register('file', MockFileWrapper::class);

// ... Tests oder Operationen mit dem Mock-Wrapper durchführen ...

// Ursprünglichen eingebauten file://-Wrapper wiederherstellen
$result = stream_wrapper_restore('file');

if ($result) {
    echo "Wrapper erfolgreich wiederhergestellt." . PHP_EOL;
} else {
    echo "Fehler beim Wiederherstellen des Wrappers." . PHP_EOL;
}

// Ab hier funktionieren normale Dateioperationen wieder
$content = file_get_contents(__FILE__);
echo "Datei gelesen: " . strlen($content) . " Bytes" . PHP_EOL;
Wrapper erfolgreich wiederhergestellt. Datei gelesen: 742 Bytes

Wiederherstellung eines aktiven (nicht entfernten) Wrappers schlägt fehl

<?php
// Versuch, einen noch aktiven Wrapper wiederherzustellen
// (wurde nicht zuvor via stream_wrapper_unregister() entfernt)
$result = @stream_wrapper_restore('http');

var_dump($result);
// Gibt false zurück, da 'http' noch registriert ist und nicht wiederhergestellt werden muss
bool(false)

// Wichtig · Fallstricke

Reihenfolge beachten: stream_wrapper_restore() funktioniert nur für Protokolle, die zuvor mit stream_wrapper_unregister() deregistriert wurden. Wurde ein Protokoll mit stream_wrapper_register() komplett neu registriert (ohne vorheriges Unregister des Originals), kann stream_wrapper_restore() das Original nicht zurückbringen.

Nur für eingebaute Wrapper: Die Funktion kann ausschließlich eingebaute PHP-Wrapper wiederherstellen. Eigene, mit stream_wrapper_register() registrierte Wrapper können nicht wiederhergestellt werden — sie müssen manuell re-registriert werden.

Einsatz in Tests: Bei Verwendung in PHPUnit oder ähnlichen Test-Frameworks empfiehlt sich der Einsatz in tearDown()-Methoden, um sicherzustellen, dass der Original-Wrapper auch nach einem Testfehler wiederhergestellt wird.