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