FAQ
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

Search Discussions

  • Michael Wallner at May 24, 2006 at 4:28 pm

    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
  • Sara Golemon at May 24, 2006 at 5:50 pm

    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
  • D. Dante Lorenso at May 25, 2006 at 6:48 am

    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

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
groupphp-internals @
categoriesphp
postedMay 24, '06 at 4:26p
activeMay 25, '06 at 6:48a
posts4
users4
websitephp.net

People

Translate

site design / logo © 2022 Grokbase