/ / Prečo PHP hodnotí $ b a $ b = $ b inak, keď sa používa s $ b ++ v array index - php, order-of-evaluation

Prečo PHP hodnotí $ b a $ b = $ b inak pri použití s ​​$ b ++ v array index - php, order-of-evaluation

Nedokážem pochopiť hodnotiacu logiku v nižšie uvedenom kóde. Vie niekto, prečo PHP hodnotí $b a $b = $b v tomto prípade inak?

Prečítal som si niekoľko otázok tu v SO a skontroloval PHP manuál, Týmto som to pochopil "PHP vo všeobecnosti neurčuje, v akom poradí sa hodnotí výraz" a to "správanie sa môže zmeniť medzi verziami PHP alebo v závislosti od okolitého kódu", Nemám pocit, že to platí aj pre túto situáciu. Alebo?

Byť prvý, kto to pripúšťa, nemusí byť tvojou každodennou problematikou kódovania, stále som zvedavý. Pokúsil sa na to, aby sa pokúsil urobiť niečo kódovanie golfu.

$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;

Výstup - PHP 5.5.14:

32
22

odpovede:

10 pre odpoveď č. 1

Toto vyzerá ako príklad v Manuálny používané na demonštráciu Nedefinovaný poradie hodnotenia, Z manuálu:

Priorita operátora a asociativita určujú len ako sú zoskupené výrazy, neurčujú poradie hodnotenia. PHP vo všeobecnosti neurčuje vktoré zariaďujú zhodnotenie výrazu a kód, ktorý predpokladá určitý poradie hodnotenia, by sa malo zabrániť, pretože správanie sa môže zmeniť medzi verziami PHP alebo v závislosti od okolitého kódu.

Dôraz bol pridaný

Príklad, ktorý poskytujú:

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

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

Získate výstup, ktorý ste, pretože v prvom príklade je index $b++ sa určuje najprv, zatiaľ čo v druhom indexe $b=$b je prvý.

NB

Ako pre prečo to je, myslím, že jeden možný dôvod je vysvetlený touto poznámkou na tej istej manuálovej stránke:

Aj keď = má nižšiu prioritu ako väčšina ostatných operátorov, PHP bude stále umožňovať výrazy podobné nasledujúcim: if (! $ A = foo ()), pričom návratová hodnota foo () je vložená do $ a.

Verím, že "chýba kľúčové posledné slovo tam: najprv (bez, pre mňa čítanie poznámky stráca trochu zmysel).

Podľa vlastných pravidiel PHP, a predpokladáme objednávku FIFO, !$a by mali byť najprv hodnotené. ak $a je práve null alebo undefined, potom !$a bude sa rovnať true (vyhodnotí sa a výsledok sa vyhodí). Po tom, foo() bude vyhodnotená a jej hodnota vrátenia bude priradená $a (aj keď budeme predpokladať FIFO, foo() musí sa najprv vyhodnotiť, ak má byť výsledok pridelený niečomu). Výsledok tejto úlohy bude hodnotený pomocou if, a bude mať za následok presne opačnú hodnotu, ktorú autor chcel.

Nie som odborník na C, ale aj trochu mi to vedie odpoveď ktorý cituje štandard C90:

(C90, 6.3) "S výnimkou ako je uvedené v syntaxi alebo inak upresnený (pre obsluhu funkcie, volanie (), &&, ||,?, A operátori čiarkou) poradie vyhodnotenie podvýrazy a poradie, v ktorom vedľajšie účinky trvať. miesta sú obaja unspecitied "

Keďže PHP je postavené na C, má zmysel, že by zdedil niektoré jeho výstrednosti.