/ / Pourquoi PHP évalue-t-il différemment $ b et $ b = $ b lorsqu'il est utilisé avec $ b ++ dans l'index de tableau - php, ordre d'évaluation

Pourquoi PHP évalue-t-il différemment $ b et $ b = $ b lorsqu'il est utilisé avec $ b ++ dans l'index de tableau - php, ordre d'évaluation

Je ne parviens pas à comprendre la logique d’évaluation dans le code ci-dessous. Est-ce que quelqu'un sait pourquoi PHP évalue $b et $b = $b différemment dans ce cas?

J'ai lu un certain nombre de questions ici à SO et vérifié la Manuel PHP. Faire ainsi, j'ai compris que "PHP (dans le cas général) ne spécifie pas dans quel ordre une expression est évaluée" et cela "le comportement peut changer entre les versions de PHP ou selon le code environnant". Je ne pense pas que cela s'applique à cette situation cependant. Ou le fait-il?

Étant le premier à admettre que ce n’est peut-être pas votre problème quotidien de codage, je suis toujours curieux. Trébuché sur essayer de faire un peu code golf.

$a = [[00, 01, 02, 03],
[10, 11, 12, 13],
[20, 21, 22, 23],
[30, 31, 32, 33]];

$b = 2;
echo $a[$b][$b++], PHP_EOL;

$b = 2;
echo $a[$b=$b][$b++], PHP_EOL;

Sortie - PHP 5.5.14:

32
22

Réponses:

10 pour la réponse № 1

Cela ressemble à l'exemple dans le Manuel utilisé pour démontrer Ordre d'évaluation non défini. A partir du manuel:

La priorité et l’associativité des opérateurs déterminent uniquement la façon dont les expressions sont regroupées. Elles ne spécifient pas d’ordre d’évaluation. PHP ne (dans le cas général) pas spécifier dansquel ordre une expression est évaluée et code qui suppose un ordre spécifique d'évaluation doit être évité, car le comportement peut changer entre les versions de PHP ou en fonction du code environnant.

Emphase ajoutée

L'exemple qu'ils donnent:

<?php
$a = 1;
echo $a + $a++; // may print either 2 or 3

$i = 1;
$array[$i] = $i++; // may set either index 1 or 2
?>

Vous obtenez la sortie que vous êtes parce que dans le premier exemple, l'index $b++ est en cours de détermination premier, alors que dans le second l'index $b=$b est le premier

NB

Pour ce qui est de Pourquoi Je pense qu’une raison possible est expliquée par cette note sur la même page de manuel:

Bien que = ait une priorité inférieure à celle de la plupart des autres opérateurs, PHP autorisera toujours des expressions similaires à ce qui suit: if (! $ A = foo ()), auquel cas la valeur de retour de foo () est mise dans $ a.

Je crois qu'ils manquent un dernier mot crucial: premier (sans moi, lire la note perd un peu de sens).

Suivant les règles de PHP, et nous supposons une commande FIFO, !$a devrait être évalué en premier. Si $a est actuellement null ou undefined, puis !$a sera égal true (il sera évalué et ce résultat sera jeté). D'après cela, foo() sera évalué, et sa valeur de retour sera assignée à $a (même si nous assumons FIFO, foo() doit être évalué en premier si son résultat doit être affecté à quelque chose). Le résultat de cette mission sera évalué par if, et aboutira exactement à la valeur opposée que l'auteur voulait.

Je ne suis pas un expert en C, mais un peu de recherche me mène aussi répondre qui cite la norme C90:

(C90, 6.3) "Sauf indication contraire de la syntaxe ou spécifiée ultérieurement (pour les opérateurs function-call operator (), &&, ||,?: Et comma), l'ordre d'évaluation des sous-expressions et l'ordre dans lequel les effets secondaires se produisent lieu sont tous deux non spécifiés "

Puisque PHP est construit sur C, il est logique qu'il hérite de certaines de ses excentricités.