Interessante Thematik. Da ich das erst nicht so recht glauben wollte, habe ich damit etwas experimentiert, und dabei auch gesehen, dass
$c = false or true;
if ($c) ...nicht das gleiche ist wie
if (false or true) ...
Natuerlich nicht, aus dem bereits besprochenen Grund mit der Klammerung:
$c = false or true;
entspricht
($c = false) or true;
Das Ergebnis von "or" ist in dem Fall zwar true, aber das wird nicht $c zugewiesen, sondern ueberhaupt nicht ausgewertet. Dasselbe passiert in allen Deinen Beispielen:
$b = 0 or foo($b);
entspricht
($b = 0) or foo($b);
das heisst $b wird gleich 0 gesetzt, und ($b = 0) liefert den Ausdruck 0 an "or", so dass auch foo($b) ausgefuehrt wird. Das hat aber nichts mit der Zuweisung an $b mehr zu tun. $b wurde vorher auf 0 gesetzt, und daher wird 0 an foo() uebergeben.
Viele Gruesse
der Bademeister