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