En octobre 2019, Python 3.8 a introduit l'opérateur Walrus (:=) via PEP 572 – et déclencha ainsi l'une des plus grandes controverses de l'histoire du langage de programmation. Le débat fut si âpre que l'inventeur de Python Guido van Rossum en juillet 2018 – avant même sa sortie – sa position de BDFL (Dictateur bienveillant à vie). Depuis début 2019, Python est désormais gouverné par un Conseil de pilotage élu.
if (n := len(items)) > 10:
print(f"List is too long ({n} elements)")
Le désaccord sur la gouvernance est apparu immédiatement après la discussion sur Walrus – un cas rare où une seule fonctionnalité de langage a eu des conséquences structurelles. Dans sa déclaration, van Rossum a expliqué : « La goutte d'eau qui a fait déborder le vase a été une proposition d'amélioration de Python très controversée. Après l'avoir acceptée, des gens se sont emparés des réseaux sociaux comme Twitter et ont tenu des propos qui m'ont personnellement blessé. »
Il a poursuivi : « Maintenant que le PEP 572 est terminé, je ne veux plus jamais avoir à me battre aussi durement pour un PEP et constater que tant de gens détestent mes décisions. Je veux me retirer complètement du processus décisionnel. » Les critiques provenaient non seulement de la communauté au sens large, mais aussi des développeurs principaux.
Ils ont soutenu que l'opérateur contredisait les principes fondamentaux de Python, notamment la préférence pour la simplicité plutôt que pour la complexité. Après près de trois décennies de règne incontesté sur le langage , cela marquait la fin d'une époque. Mais si Python a dû introduire un nouvel opérateur Walrus, divisant au passage sa communauté, une question se pose : comment les autres langages gèrent-ils des concepts similaires ?
L'opérateur Python := L'expression d'affectation (alias « Walrus ») n'existe pas en PHP, car elle n'est pas nécessaire. En PHP, l'opérateur d'affectation = toujours Déclaration et expression à la fois: Une affectation renvoie la valeur assignée. C'est précisément pourquoi les modèles idiomatiques comme « assign-and-test » fonctionnent if-conditions sans caractéristique linguistique propre.
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() attribue et évalue à droite. Si c'est « vrai », vous entrez le if-Bloquer. Contexte : En Python, := (PEP 572) car les affectations simples ne sont pas des expressions. En PHP, cela a toujours été différent, il n'y a donc pas besoin d'équivalent. Deux facteurs sont souvent à l'origine de bugs.: = (Affectation) a une priorité inférieure à la plupart des opérateurs relationnels ; les parenthèses déterminent l'évaluation.
Dans les expressions plus complexes, vous devez toujours utiliser des parenthèses pour améliorer la lisibilité et la clarté. ?? possède sa propre priorité, plutôt faible. Ceci explique les surprises dans des expressions comme $x ?? null === null. Sans parenthèses, d'abord null === null évalué. Il est préférable de toujours mettre explicitement entre parenthèses: ($x ?? null) === null. $a existe également en dehors de la if-Blocs – éventuellement avec une valeur fausse.
function get_some_field() {
return 'bar';
}
if ( ($a = get_some_field()) === 'bar' ) {
echo $a; // bar
}
Il est donc clair que === 'bar' est appliqué à la valeur assignée. Les crochets sont importants ici pour la lisibilité et la priorité. En pratique, ce modèle évite les doublons inutiles (par exemple, du générateur de requêtes) en stockant le résultat de la requête, puis en le vérifiant. Dans les applications productives, comme les projets basés sur Laravel, le modèle suivant est plus fréquent.:
if ( ($foo = Foo::where('foo', 'bar')) && $foo->count() > 0 ) {
dd($foo->get());
}
&& est un court-circuit : la partie droite n'est évaluée que si la partie gauche est vraie. En affectant l'instruction en amont, vous évitez de l'affecter en dehors de l'instruction if. La pertinence de cette pratique dépend du code et des outils d'analyse de votre équipe ; sémantiquement, c'est correct. Au minimum, vous devriez savoir ce que fait le code si vous le rencontrez en situation réelle.
PHP n'a pas besoin d'opérateur Walrus, car les affectations sont déjà des expressions. Cela rend possibles des schémas idiomatiques comme « assign-and-test », performants et concis. Parallèlement, les exigences de discipline augmentent : parenthèses, comparaisons strictes, respect des règles de vrai et de faux et conventions d'équipe claires sont indispensables. Ceux qui suivent ces directives bénéficient des avantages de Walrus sans nécessiter de fonctionnalité de langage supplémentaire.