În octombrie 2019, Python 3.8 a introdus operatorul Walrus (:=) prin intermediul PEP 572 – și astfel a declanșat una dintre cele mai mari controverse din istoria limbajului de programare. Dezbaterea a fost atât de aprigă încât inventatorul Python Guido van Rossum în iulie 2018 – chiar înainte de lansare – poziția sa de BDFL (Dictator binevoitor pe viațăDe la începutul anului 2019, Python a fost guvernat în schimb de un Consiliu Director ales.
if (n := len(items)) > 10:
print(f"List is too long ({n} elements)")
Ruptura de guvernanță a apărut imediat după discuția despre Walrus - un caz rar în care o singură caracteristică a limbajului a avut consecințe structurale. În declarația sa, van Rossum a explicat: „Cea ce a umplut paharul a fost o propunere foarte controversată de îmbunătățire a Python. După ce am acceptat-o, oamenii au apelat la rețelele de socializare precum Twitter și au spus lucruri care m-au rănit personal.”
El a continuat: „Acum că PEP 572 s-a terminat, nu vreau să mai trebuiască să lupt atât de mult pentru un PEP și să constat că atât de mulți oameni îmi detestă deciziile. Vreau să mă retrag complet din procesul decizional.” Criticile au venit nu doar din partea comunității largi, ci și din partea dezvoltatorilor principali.
Aceștia au susținut că operatorul contrazicea principiile fundamentale ale limbajului Python din era Zen a lui Python - în special preferința pentru simplitate în detrimentul complexității. După aproape trei decenii ca designer de limbaje incontestabil, acest lucru a marcat sfârșitul unei ere. Dar, deși Python a trebuit să introducă un nou operator Walrus, divizând comunitatea sa în acest proces, se pune întrebarea: Cum gestionează alte limbaje concepte similare?
Operatorul Python := (Expresia de atribuire alias „Walrus”) nu există în PHP – deoarece nu este necesară. În PHP, operatorul de atribuire = întotdeauna Afirmație și exprimare în același timp: O atribuire returnează valoarea atribuită. Tocmai de aceea funcționează modelele idiomatice precum „atribuire-și-testare” în if-condiții fără o trăsătură lingvistică proprie.
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() atribuie și evaluează în partea dreaptă. Dacă aceasta este „adevărată”, introduceți if-Bloc. Context: În Python, := (PEP 572) deoarece atribuțiile simple nu sunt expresii. În PHP, acest lucru a fost întotdeauna diferit, deci nu există o nevoie echivalentă. Două lucruri duc adesea la erori.: = (Atribuire) are o precedență mai mică decât majoritatea operatorilor relaționali; parantezele determină evaluarea.
În expresiile mai complexe, ar trebui să folosiți întotdeauna paranteze pentru a crește lizibilitatea și claritatea. ?? are propria prioritate, destul de scăzută. Aceasta explică surprizele în expresii precum $x ?? null === null. Fără paranteze, mai întâi null === null evaluat. Este mai bine să se pună întotdeauna explicit în paranteze: ($x ?? null) === null. $a există și în afara if-Blocuri – posibil cu o valoare falsă.
function get_some_field() {
return 'bar';
}
if ( ($a = get_some_field()) === 'bar' ) {
echo $a; // bar
}
Deci este clar că === 'bar' se aplică valorii atribuite. Parantezele sunt importante aici pentru lizibilitate și prioritate. În practică, acest model evită apelurile duplicate inutile (de exemplu, ale constructorului de interogări) prin stocarea rezultatului interogării și apoi verificarea acestuia. În aplicațiile productive, cum ar fi proiectele bazate pe Laravel, următorul model poate fi observat mai frecvent.:
if ( ($foo = Foo::where('foo', 'bar')) && $foo->count() > 0 ) {
dd($foo->get());
}
&& este un scurtcircuit: Partea dreaptă este evaluată doar dacă partea stângă este adevărată. Prin atribuirea instrucțiunii în amonte, evitați atribuirea instrucțiunii în afara instrucțiunii if. Dacă aceasta este o practică bună depinde de codul echipei dvs. și de instrumentele de analiză; semantic, este corectă. Cel puțin, ar trebui să știți ce face codul dacă îl întâlniți în mediul virtual.
PHP nu are nevoie de un „operator Walrus” deoarece atribuirile sunt deja expresii. Acest lucru face posibile modele idiomatice precum „atribuire-și-testare” – performante și concise. În același timp, cerințele privind disciplina cresc: parantezele, comparațiile stricte, conștientizarea diferențelor de adevăr/fals și convențiile clare ale echipei sunt obligatorii. Cei care respectă aceste îndrumări culeg beneficiile ideii Walrus fără a necesita o caracteristică suplimentară de limbaj.