Opérateurs logiques et priorité des opérateurs d'affectation en PHP.
P粉176980522
2023-08-07 11:55:52
<p>Je l'ai récemment trouvé dans un passage comme celui-ci :</p>
<pre class="brush:php;toolbar:false;">$x = 2 && $y = 3; echo (int)$x.':'.(int)$y;</ pré>
<p>Cet extrait de code produit une sortie 1:3. En regardant le tableau de priorité des opérateurs, j'ai découvert que les opérateurs logiques || et && ont une priorité plus élevée que l'opérateur d'affectation =. Par conséquent, la première expression doit être traitée comme $x = ($y || 2) = 3 ; ce qui fait $x = (2 && $y) = 3 et est finalement évalué à $x = false = 3 ; . Deuxièmement, l'opérateur d'affectation a un ordre correct, donc l'interprète doit essayer de faire false = 3, ce qui est évidemment illégal. Donc, à mon avis, l'extrait de code mentionné ci-dessus ne devrait pas être compilé et devrait générer une erreur d'analyse ou d'exécution. Mais au lieu de cela, cet extrait a produit un rapport de 1:3. Cela signifie que ce que fait l'interprète est : </p>
<blockquote>
<p>a) $y=3</p>
<p>b) 2 && $y</p>
<p>c) $x = (2 && $y)</p>
</blockquote>
<p>Pourquoi procéder ainsi plutôt que de se baser sur la priorité des opérateurs ?</p>
Le tableau de priorité des opérateurs que vous avez fourni indique dans un commentaire séparé :
Ainsi, en effet, une affectation au sein d'une expression sera traitée comme une sous-expression. Comment et quand cela est fait n'est pas clairement indiqué dans la documentation, qui indique simplement que des expressions « similaires » fonctionneront de cette façon.