Walrus-operator i PHP

I oktober 2019 introducerede Python 3.8 Walrus-operatoren (:=) via PEP 572 – og dermed udløste en af de største kontroverser i programmeringssprogets historie. Debatten var så bitter, at Pythons opfinder Guido van Rossum i juli 2018 – selv før løsladelsen – sin stilling som BDFL (Velvillig diktator for livetSiden begyndelsen af 2019 har Python i stedet været styret af et valgt styringsråd.


if (n := len(items)) > 10:
    print(f"List is too long ({n} elements)")

Governance-kløften opstod umiddelbart efter Walrus-diskussionen – et sjældent tilfælde, hvor en enkelt sprogfunktion havde strukturelle konsekvenser. I sin udtalelse forklarede van Rossum: "Den sidste dråbe var et meget kontroversielt Python-forbedringsforslag. Efter jeg accepterede det, gik folk på sociale medier som Twitter og sagde ting, der sårede mig personligt."

Han fortsatte: "Nu hvor PEP 572 er overstået, ønsker jeg aldrig at skulle kæmpe så hårdt for en PEP igen og opleve, at så mange mennesker afskyr mine beslutninger. Jeg vil helt fjerne mig selv fra beslutningsprocessen." Kritikken kom ikke kun fra det bredere fællesskab, men også fra kerneudviklere.

De argumenterede for, at operatoren var i modstrid med grundlæggende Python-principper fra Zen of Python – især præferencen for enkelhed frem for kompleksitet. Efter næsten tre årtier som den ubestridte sprogdesigner markerede dette afslutningen på en æra. Men mens Python måtte introducere en ny Walrus-operator, hvilket splittede sit fællesskab i processen, opstår spørgsmålet: Hvordan håndterer andre sprog lignende koncepter?

Python-operatoren := (Tildelingsudtryk alias "Walrus") findes ikke i PHP – fordi det ikke er nødvendigt. I PHP er tildelingsoperatoren = altid Udsagn og udtryk på samme tid: En tildeling returnerer den tildelte værdi. Det er netop derfor, idiomatiske mønstre som "tildel-og-test" fungerer i if-forhold uden deres eget sproglige træk.

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() tildeler og evaluerer til højre side. Hvis dette er "sandt", indtaster du if-Blok. Baggrund: I Python, := (PEP 572) fordi simple tildelinger ikke er udtryk. I PHP har dette altid været anderledes, så der er ikke noget tilsvarende behov. To ting fører ofte til fejl.: = (Tildeling) har en lavere prioritet end de fleste relationelle operatorer; parenteser bestemmer evalueringen.

I mere komplekse udtryk bør du altid bruge parenteser for at øge læsbarheden og klarheden. ?? har sin egen, ret lave prioritet. Dette forklarer overraskelser i udtryk som $x ?? null === null. Uden parenteser, først null === null evalueret. Det er bedre altid at sætte parenteser eksplicit: ($x ?? null) === null. $a findes også uden for if-Blokke – muligvis med en falsk værdi.

function get_some_field() {
    return 'bar';
}
if ( ($a = get_some_field()) === 'bar' ) {
    echo $a; // bar
}

Så det er klart, at === 'bar' anvendes på den tildelte værdi. Parenteser er vigtige her for læsbarhed og prioritet. I praksis undgår dette mønster unødvendige duplikerede kald (f.eks. af forespørgselsbyggeren) ved at gemme forespørgselsresultatet og derefter kontrollere det. I produktive applikationer, såsom Laravel-baserede projekter, kan følgende mønster observeres oftere.:

if ( ($foo = Foo::where('foo', 'bar')) && $foo->count() > 0 ) {
    dd($foo->get());
}

&& kortslutter: Den højre del evalueres kun, hvis den venstre del er sand. Ved at tildele sætningen upstream undgår du at tildele sætningen uden for if-sætningen. Om dette er god praksis afhænger af dit teams kode og analyseværktøjer; semantisk er det korrekt. Som minimum bør du vide, hvad koden gør, hvis du støder på den i praksis.

PHP behøver ikke en "Walrus-operator", fordi tildelinger allerede er udtryk. Dette muliggør idiomatiske mønstre som "tildel-og-test" – effektive og præcise. Samtidig stiger kravene til disciplin: parenteser, strenge sammenligninger, bevidsthed om sandhed/falskhed og klare teamkonventioner er obligatoriske. De, der følger disse retningslinjer, høster fordelene ved Walrus-ideen uden at kræve en yderligere sprogfunktion.

Tilbage