Start · Sprachen · PHP · Referenz · Stringable

Stringable

Interface

Kennzeichnet, dass eine Klasse eine <code>__toString()</code>-Methode besitzt und damit in einen String umgewandelt werden kann.

seit PHP 8.0.0 Kategorie: misc

Signatur

interface Stringable

Beschreibung

Das Interface Stringable markiert Klassen, die eine __toString()-Methode implementieren und somit in einen String konvertierbar sind. Es enthält genau eine Methode: public __toString(): string. Das Interface wurde mit PHP 8.0 eingeführt, um Typdeklarationen wie string|Stringable zu ermöglichen und so sowohl einfache Strings als auch Objekte mit String-Darstellung akzeptieren zu können.

Eine Besonderheit von Stringable ist sein implizites Verhalten: Jede Klasse, die eine __toString()-Methode definiert, implementiert dieses Interface automatisch – auch ohne explizite implements Stringable-Deklaration. Die explizite Angabe wird jedoch empfohlen, da sie die Absicht des Entwicklers klar dokumentiert und Typ-Prüfwerkzeuge wie statische Analysatoren unterstützt.

Typischer Einsatz ist die Deklaration von Funktionsparametern oder Rückgabetypen, die sowohl primitive Strings als auch stringifizierbare Objekte akzeptieren sollen. Mit dem Union-Typ string|Stringable lässt sich eine flexible, typsichere API gestalten, ohne auf Typprüfungen zur Laufzeit angewiesen zu sein.

In PHP 8.0 und höher erhalten Klassen, die __toString() definieren, automatisch das Stringable-Interface – auch rückwirkend für bestehenden Code, ohne dass dieser angepasst werden muss.

Beispiele

Explizite Implementierung von Stringable

<?php

class Benutzername implements Stringable
{
    public function __construct(private string $name) {}

    public function __toString(): string
    {
        return $this->name;
    }
}

$benutzer = new Benutzername('Maria');
echo $benutzer; // Gibt 'Maria' aus

var_dump($benutzer instanceof Stringable); // bool(true)
Maria bool(true)

Verwendung als Typdeklaration mit string|Stringable

<?php

class Produkt implements Stringable
{
    public function __construct(private string $bezeichnung) {}

    public function __toString(): string
    {
        return $this->bezeichnung;
    }
}

function zeigeBezeichnung(string|Stringable $wert): void
{
    echo "Bezeichnung: " . $wert . PHP_EOL;
}

// Funktioniert mit einem einfachen String:
zeigeBezeichnung('Tisch');

// Funktioniert mit einem Stringable-Objekt:
$produkt = new Produkt('Stuhl');
zeigeBezeichnung($produkt);
Bezeichnung: Tisch Bezeichnung: Stuhl

Implizite Implementierung ohne explizites implements

<?php

// Kein explizites 'implements Stringable' notwendig
class Farbe
{
    public function __construct(private string $name) {}

    public function __toString(): string
    {
        return $this->name;
    }
}

$farbe = new Farbe('Blau');

// Dennoch instanceof Stringable: true
var_dump($farbe instanceof Stringable);

// Funktioniert auch als Argument für string|Stringable:
function drucke(string|Stringable $s): void {
    echo $s . PHP_EOL;
}
drucke($farbe);
bool(true) Blau

// Wichtig · Fallstricke

Implizite vs. explizite Implementierung: Obwohl PHP Stringable implizit hinzufügt, sobald __toString() vorhanden ist, sollte man das Interface explizit angeben. Dies verbessert die Lesbarkeit des Codes und ermöglicht statischen Analysetools wie PHPStan oder Psalm, die Absicht korrekt zu erkennen.

Rückwärtskompatibilität: Da Stringable erst ab PHP 8.0 existiert, kann es in Code, der noch PHP 7.x unterstützen muss, nicht verwendet werden. In solchen Fällen muss auf Docblock-Annotationen oder manuelle is_string()/method_exists()-Prüfungen zurückgegriffen werden.

Kein Ersatz für string: Ein Parameter vom Typ Stringable (ohne string|) akzeptiert keine primitiven Strings, da primitive Typen keine Interfaces implementieren. Für maximale Flexibilität stets den Union-Typ string|Stringable nutzen.