Start · Sprachen · PHP · Referenz · stream_register_wrapper

stream_register_wrapper

Funktion

Alias von <code>stream_wrapper_register()</code> — registriert eine benutzerdefinierte Stream-Wrapper-Klasse für ein URL-Protokoll.

seit PHP 4.3.0 Kategorie: io

Signatur

stream_register_wrapper(string $protocol, string $class, int $flags = 0): bool

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

Typ
bool
Beschreibung
Gibt 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);
Hallo von MemoryStream!

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
bool(true) bool(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.