Internals,
Seems the order or left vs right assignment evaluation has changed
somehow recently in my upgrade to PHP 5.1.4. See the following code:
---------- 8< -------------------- 8< ----------
<?php
$data = array();
$index = 0;
for ($x = 0; $x < 5; $x++) {
$data[$index] = $index++;
}
print_r($data);
?>
---------- 8< -------------------- 8< ----------
in PHP 5.0.5:
Array
(
[0] => 0
[1] => 1
[2] => 2
[3] => 3
[4] => 4
)
in PHP 5.1.4:
Array
(
[1] => 0
[2] => 1
[3] => 2
[4] => 3
[5] => 4
)
Is this a bug, a feature, or bad programmer [me]?
Dante
D. Dante Lorenso wrote:
Internals,
Seems the order or left vs right assignment evaluation has changed
somehow recently in my upgrade to PHP 5.1.4. See the following code:---------- 8< -------------------- 8< ----------
<?php
$data = array();
$index = 0;
for ($x = 0; $x < 5; $x++) {
$data[$index] = $index++;
}
The behaviour is undefined (tm) if you use the variable to be in/decremented more than once in a statement.
Regards,
Michael
Seems the order or left vs right assignment evaluation has changed somehow
recently in my upgrade to PHP 5.1.4. See the following code:
That's is indeed a quirk of a change in the way variables are
retreived/stored between 5.0 and 5.1.
Is it an unexpected BC break? In functional terms yes, but technically no.
As mike already replied, using the same var more than once in a single
expression where the value of the variable is expected to change is (and has
always been) considered "undefined behavior". I'd recommend changing your
statement to:
$data[$index] = $index;
++$index;
And before you complain about the "extra work" for the engine, let me just
mention this is still lighter weight than what 5.0 and 4.x were doing.
-Sara
Sara Golemon wrote:
Seems the order or left vs right assignment evaluation has changed
somehow recently in my upgrade to PHP 5.1.4. See the following code:That's is indeed a quirk of a change in the way variables are
retreived/stored between 5.0 and 5.1.
Is it an unexpected BC break? In functional terms yes, but technically
no. As mike already replied, using the same var more than once in a
single expression where the value of the variable is expected to
change is (and has always been) considered "undefined behavior". I'd
recommend changing your statement to:
$data[$index] = $index;
++$index;And before you complain about the "extra work" for the engine, let me
just mention this is still lighter weight than what 5.0 and 4.x were
doing.
No complaints here. This is a change I can easily work around and don't
mind the BC breakage. Just wanted to illuminate the error to internals
just in case it would reflect upon possible breakage elsewhere. I
worked around the undefined behavior before the first email was sent ;-)
Keep up the good work all.
Dante