Walrus-operatorn i PHP

I oktober 2019 introducerade Python 3.8 operatorn Walrus (:=) via PEP 572 – och utlöste därmed en av de största kontroverserna i programmeringsspråkets historia. Debatten var så bitter att uppfinnaren av Python Guido van Rossum i juli 2018 – redan före frigivningen – hans position som BDFL (Välvillig diktator för livetSedan början av 2019 har Python istället styrts av en vald styrgrupp.


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

Styrningsbristen uppstod omedelbart efter Walrus-diskussionen – ett sällsynt fall där en enskild språkfunktion hade strukturella konsekvenser. I sitt uttalande förklarade van Rossum: "Den sista droppen var ett mycket kontroversiellt Python-förbättringsförslag. Efter att jag accepterat det gick folk till sociala medier som Twitter och sa saker som sårade mig personligen."

Han fortsatte: ”Nu när PEP 572 är över vill jag aldrig behöva kämpa så hårt för en PEP igen och upptäcka att så många människor avskyr mina beslut. Jag vill helt ta bort mig själv från beslutsprocessen.” Kritiken kom inte bara från den bredare gemenskapen, utan även från kärnutvecklare.

De hävdade att operatorn stred mot grundläggande Python-principer från Zen of Python – särskilt preferensen för enkelhet framför komplexitet. Efter nästan tre decennier som den obestridda språkutvecklaren markerade detta slutet på en era. Men medan Python var tvungen att introducera en ny Walrus-operator, vilket splittrade sin community i processen, uppstår frågan: Hur hanterar andra språk liknande koncept?

Python-operatorn := (Tilldelningsuttryck alias "Walrus") finns inte i PHP – eftersom det inte behövs. I PHP är tilldelningsoperatorn = alltid Uttalande och uttryck på samma gång: En tilldelning returnerar det tilldelade värdet. Det är just därför idiomatiska mönster som "tilldela-och-testa" fungerar i if-förhållanden utan eget språkligt särdrag.

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() tilldelar och utvärderar till höger sida. Om detta är "sant", anger du if-Block. Bakgrund: I Python, := (PEP 572) eftersom enkla tilldelningar inte är uttryck. I PHP har detta alltid varit annorlunda, så det finns inget motsvarande behov. Två saker leder ofta till buggar.: = (Tilldelning) har lägre prioritet än de flesta relationella operatorer; parenteser avgör utvärderingen.

I mer komplexa uttryck bör du alltid använda parenteser för att öka läsbarheten och tydligheten. ?? har sin egen, ganska låga prioritet. Detta förklarar överraskningar i uttryck som $x ?? null === null. Utan parenteser, först null === null utvärderas. Det är bättre att alltid explicit placera parenteser: ($x ?? null) === null. $a finns även utanför if-Block – eventuellt med ett falskt värde.

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

Så det är tydligt att === 'bar' tillämpas på det tilldelade värdet. Parenteser är viktiga här för läsbarhet och prioritet. I praktiken undviker detta mönster onödiga dubbletter (t.ex. av frågebyggaren) genom att lagra frågeresultatet och sedan kontrollera det. I produktiva applikationer, såsom Laravel-baserade projekt, kan följande mönster observeras oftare.:

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

&& kortsluter: Den högra delen utvärderas bara om den vänstra delen är sanningsenlig. Genom att tilldela satsen uppströms undviker du att tilldela satsen utanför if-satsen. Huruvida detta är god praxis beror på ditt teams kod och analysverktyg; semantiskt är det korrekt. Som allra minst bör du veta vad koden gör om du stöter på den i verkligheten.

PHP behöver inte en "Walrus-operator" eftersom tilldelningar redan är uttryck. Detta möjliggör idiomatiska mönster som "tilldela-och-testa" – effektiva och koncisa. Samtidigt ökar kraven på disciplin: parenteser, strikta jämförelser, medvetenhet om sant/falskt och tydliga teamkonventioner är obligatoriska. De som följer dessa riktlinjer skördar fördelarna med Walrus-idén utan att behöva en ytterligare språkfunktion.

Tillbaka