Signatur
Beschreibung
stream_register_wrapper() ist ein vollständiger Alias der Funktion stream_wrapper_register(). Sie ermöglicht es, eigene Stream-Wrapper-Klassen für selbst definierte Protokolle (z. B. myproto://) zu registrieren, sodass diese anschließend mit allen PHP-Stream-Funktionen wie fopen(), file_get_contents() oder copy() verwendet werden können.
Der erste Parameter legt den Namen des Protokolls fest (ohne ://), der zweite Parameter den vollqualifizierten Klassennamen, der die Stream-Wrapper-Schnittstelle implementiert. Die Klasse muss alle für den gewünschten Verwendungszweck erforderlichen Methoden wie stream_open(), stream_read(), stream_write() etc. implementieren.
Über den optionalen Parameter $flags kann mit der Konstante STREAM_IS_URL angegeben werden, dass es sich um einen URL-Wrapper handelt, was z. B. relevant ist, wenn allow_url_fopen oder allow_url_include in der PHP-Konfiguration deaktiviert ist.
Da es sich um einen Alias handelt, wird in neuem Code die Verwendung von stream_wrapper_register() bevorzugt, um Konsistenz zu gewährleisten. Beide Funktionen verhalten sich jedoch identisch.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $protocol Pflicht | string | Name des Protokolls, das registriert werden soll (ohne ://), z. B. "myproto". |
|
| $class Pflicht | string | Vollqualifizierter Klassenname, der den Stream-Wrapper implementiert. Die Klasse muss alle benötigten Methoden für die Stream-Operationen bereitstellen. | |
| $flags | int | 0 | Optionale Flags. Aktuell wird nur STREAM_IS_URL unterstützt, das den Wrapper als URL-Wrapper kennzeichnet. |
Rückgabewert
true bei Erfolg zurück, false wenn das Protokoll bereits registriert ist oder die angegebene Klasse nicht existiert.Beispiele
Einfachen Stream-Wrapper registrieren und nutzen
<?php
class MemoryStreamWrapper
{
private string $buffer = '';
private int $position = 0;
public $context;
public function stream_open(string $path, string $mode, int $options, ?string &$opened_path): bool
{
$this->buffer = 'Hallo von MemoryStream!';
$this->position = 0;
return true;
}
public function stream_read(int $count): string
{
$chunk = substr($this->buffer, $this->position, $count);
$this->position += strlen($chunk);
return $chunk;
}
public function stream_eof(): bool
{
return $this->position >= strlen($this->buffer);
}
public function stream_stat(): array
{
return [];
}
}
// Alias stream_register_wrapper verwenden
stream_register_wrapper('mem', MemoryStreamWrapper::class);
$handle = fopen('mem://test', 'r');
echo fread($handle, 1024);
fclose($handle);
Protokoll-Konflikt abfangen
<?php
class MyWrapper
{
public $context;
public function stream_open(string $path, string $mode, int $options, ?string &$opened_path): bool { return true; }
public function stream_read(int $count): string { return ''; }
public function stream_eof(): bool { return true; }
public function stream_stat(): array { return []; }
}
$result1 = stream_register_wrapper('custom', MyWrapper::class);
var_dump($result1); // true
// Nochmalige Registrierung desselben Protokolls schlägt fehl
$result2 = stream_register_wrapper('custom', MyWrapper::class);
var_dump($result2); // false
// Wichtig · Fallstricke
Alias: stream_register_wrapper() ist ein Alias von stream_wrapper_register(). In neuem Code sollte bevorzugt stream_wrapper_register() verwendet werden.
Sicherheit: Benutzerdefinierte Stream-Wrapper, die externe URLs oder Eingaben verarbeiten, sollten Eingaben sorgfältig validieren, um Path-Traversal- oder Injection-Angriffe zu vermeiden.
Ein bereits registriertes Protokoll kann mit stream_wrapper_unregister() entfernt und anschließend neu registriert werden. Mit stream_get_wrappers() lassen sich alle aktuell registrierten Wrapper auflisten.