Im Oktober 2019 führte Python 3.8 den Walrus-Operator (:=) via PEP 572 ein – und löste damit eine der größten Kontroversen in der Geschichte der Programmiersprache aus. Die Debatte war so erbittert, dass Python-Erfinder Guido van Rossum im Juli 2018 – noch vor dem Release – seine Position als BDFL (Benevolent Dictator For Life) niederlegte. Seit Anfang 2019 wird Python stattdessen von einem gewählten Steering Council geführt.
if (n := len(items)) > 10:
print(f"List is too long ({n} elements)")
Die Governance-Zäsur entstand unmittelbar im Nachgang zur Walrus-Diskussion – ein seltener Fall, in dem ein einzelnes Sprachfeature strukturelle Konsequenzen hatte. In seiner Stellungnahme erklärte van Rossum: „Der Tropfen, der das Fass zum Überlaufen brachte, war ein sehr kontroverses Python Enhancement Proposal. Nachdem ich es akzeptiert hatte, gingen Leute auf Social Media wie Twitter und sagten Dinge, die mich persönlich sehr verletzt haben“.
Weiter führte er aus: „Jetzt, da PEP 572 erledigt ist, möchte ich niemals wieder so hart für ein PEP kämpfen müssen und dabei feststellen, dass so viele Menschen meine Entscheidungen verabscheuen. Ich möchte mich vollständig aus dem Entscheidungsprozess zurückziehen.“ Die Kritik kam nicht nur von der breiten Community, sondern auch von Core-Entwicklern.
Diese argumentierten, der Operator widerspreche fundamentalen Python-Prinzipien aus dem Zen of Python – insbesondere der Präferenz für Einfachheit über Komplexität. Nach fast drei Jahrzehnten als unangefochtener Sprachgestalter war dies das Ende einer Ära. Doch während Python einen neuen Walrus-Operator einführen musste und dabei seine Community spaltete, stellt sich die Frage: Wie handhaben andere Sprachen ähnliche Konzepte?
Den Python-Operator := (Assignment Expression alias „Walrus“, zu Deutsch „“ „Walross“) gibt es in PHP nicht – denn er wird auch nicht gebraucht. In PHP ist der Zuweisungsoperator = schon immer Statement und Ausdruck zugleich: Eine Zuweisung liefert den zugewiesenen Wert zurück. Genau deshalb funktionieren idiomatische Muster wie „assign-and-test“ in if-Bedingungen ohne eigenes Sprachfeature.
function get_some_field() {
return 'foo';
}
if ($a = get_some_field()) {
echo $a; // foo
}
// Hinweis: $a ist *gesetzt*, selbst wenn die Bedingung falsy wäre.
$a = get_some_field() weist zu und wertet zur rechten Seite aus. Ist diese „truthy“, betritt man den if-Block. Zum Hintergrund: In Python wurde := (PEP 572) eingeführt, weil dort einfache Zuweisungen keine Ausdrücke sind. In PHP ist das seit jeher anders, daher existiert kein gleichwertiger Bedarf. Zwei Dinge führen häufig zu Bugs: = (Zuweisung) hat eine niedrigere Priorität als die meisten Vergleichsoperatoren; Klammern bestimmen die Auswertung.
In komplexeren Ausdrücken sollte man immer klammern, um Lesbarkeit und Eindeutigkeit zu erhöhen. ?? hat eine eigene, eher niedrige Priorität. Das erklärt Überraschungen in Ausdrücken wie $x ?? null === null. Ohne Klammern wird zuerst null === null ausgewertet. Besser sollte man immer explizit klammern: ($x ?? null) === null. $a existiert auch außerhalb des if-Blocks – ggf. mit einem falsy Wert.
function get_some_field() {
return 'bar';
}
if ( ($a = get_some_field()) === 'bar' ) {
echo $a; // bar
}
So ist klar, dass === 'bar' auf den zugewiesenen Wert angewendet wird. Klammern sind hier wichtig für Lesbarkeit und Priorität. In der Praxis vermeidet dieses Muster unnötige doppelte Aufrufe (z.B. des Query-Builders), indem das Ergebnis der Abfrage gespeichert und dann geprüft wird. In produktiven Anwendungen, wie Laravel-basierten Projekten, kann man folgendes Pattern häufiger beobachten:
if ( ($foo = Foo::where('foo', 'bar')) && $foo->count() > 0 ) {
dd($foo->get());
}
&& ist kurzschließend: Der rechte Teil wird nur ausgewertet, wenn der linke truthy ist. Durch das vorgeschaltete Zuweisen vermeidet man eine Zuweisung außerhalb der if-Abfrage. Ob das ein guter Stil ist, hängt von eurem Team-Kodex und Analysetools ab; semantisch ist es korrekt. Zumindest sollte man wissen, was der Code tut, wenn man in freier Wildbahn darauf stößt.
PHP braucht also keinen „Walrus-Operator“, weil Zuweisungen bereits Ausdrücke sind. Das macht idiomatische Muster wie „assign-and-test“ möglich – performant und knapp. Gleichzeitig steigen die Anforderungen an Disziplin: Klammern, strikte Vergleiche, Bewusstsein für truthy/falsy und klare Teamkonventionen sind Pflicht. Wer diese Leitplanken beachtet, bekommt die Vorteile der Walrus-Idee ohne ein weiteres Sprachfeature.