Operatore Walrus in PHP

Nell'ottobre 2019, Python 3.8 ha introdotto l'operatore Walrus (:=) tramite PEP 572 – e innescò così una delle più grandi controversie nella storia del linguaggio di programmazione. Il dibattito fu così aspro che l'inventore di Python Guido van Rossum nel luglio 2018 – ancor prima della pubblicazione – la sua posizione di BDFL (Dittatore benevolo a vita). Dall'inizio del 2019, Python è invece governato da un Consiglio direttivo eletto.


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

La frattura nella governance è emersa subito dopo la discussione su Walrus, un raro caso in cui una singola funzionalità del linguaggio ha avuto conseguenze strutturali. Nella sua dichiarazione, van Rossum ha spiegato: "La goccia che ha fatto traboccare il vaso è stata una proposta di miglioramento di Python molto controversa. Dopo averla accettata, la gente si è riversata sui social media come Twitter e ha scritto cose che mi hanno ferito personalmente".

Ha continuato: "Ora che il PEP 572 è terminato, non voglio più dover lottare così duramente per un PEP e scoprire che così tante persone detestano le mie decisioni. Voglio ritirarmi completamente dal processo decisionale". Le critiche non provenivano solo dalla comunità in generale, ma anche dagli sviluppatori principali.

Sostenevano che l'operatore contraddicesse i principi fondamentali di Python, in particolare la preferenza per la semplicità rispetto alla complessità . Dopo quasi tre decenni come indiscusso progettista del linguaggio, questo segnò la fine di un'era. Ma mentre Python dovette introdurre un nuovo operatore Walrus, dividendo la sua comunità nel processo, sorge spontanea la domanda: come gestiscono altri linguaggi concetti simili?

L'operatore Python := (Alias "Walrus" per l'espressione di assegnazione) non esiste in PHP, perché non è necessario. In PHP, l'operatore di assegnazione = Sempre Affermazione ed espressione allo stesso tempo: Un'assegnazione restituisce il valore assegnato. Questo è esattamente il motivo per cui modelli idiomatici come "assign-and-test" funzionano in if-condizioni prive di una propria caratteristica linguistica.

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() assegna e valuta al lato destro. Se questo è "veritoso", inserisci if-Blocco. Contesto: in Python, := (PEP 572) perché le assegnazioni semplici non sono espressioni. In PHP, questo è sempre stato diverso, quindi non c'è bisogno di un equivalente. Due cose spesso portano a bug.: = (Assegnazione) ha una precedenza inferiore rispetto alla maggior parte degli operatori relazionali; le parentesi determinano la valutazione.

Nelle espressioni più complesse, è sempre opportuno utilizzare le parentesi per aumentare la leggibilità e la chiarezza. ?? ha una sua priorità piuttosto bassa. Questo spiega le sorprese in espressioni come $x ?? null === null. Senza parentesi, prima null === null valutato. È meglio sempre mettere tra parentesi in modo esplicito: ($x ?? null) === null. $a esiste anche al di fuori del if-Blocchi – possibilmente con un valore falso.

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

Quindi è chiaro che === 'bar' viene applicato al valore assegnato. Le parentesi sono importanti in questo caso per la leggibilità e la priorità. In pratica, questo schema evita inutili chiamate duplicate (ad esempio, del generatore di query) memorizzando il risultato della query e quindi verificandolo. Nelle applicazioni produttive, come i progetti basati su Laravel, il seguente schema può essere osservato più frequentemente.:

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

&& è un cortocircuito: la parte destra viene valutata solo se la parte sinistra è veritiera. Assegnando l'istruzione a monte, si evita di assegnarla al di fuori dell'istruzione if. Se questa sia una buona pratica dipende dal codice e dagli strumenti di analisi del team; semanticamente, è corretta. Come minimo, dovresti sapere cosa fa il codice se lo incontri in giro.

PHP non ha bisogno di un "operatore Walrus" perché le assegnazioni sono già espressioni. Questo rende possibili schemi idiomatici come "assign-and-test", performanti e concisi. Allo stesso tempo, aumentano le esigenze di disciplina: parentesi, confronti rigorosi, consapevolezza del vero/falso e chiare convenzioni di team sono obbligatori. Chi segue queste linee guida trae vantaggio dall'idea di Walrus senza dover ricorrere a funzionalità aggiuntive del linguaggio.

Indietro