Edit report at http://bugs.php.net/bug.php?id=45595&edit=1

 ID:                 45595
 Updated by:         rquadl...@php.net
 Reported by:        robin_fernandes at uk dot ibm dot com
 Summary:            ArrayObject::STD_PROP_LIST does not behave as
                     documented with foreach
 Status:             Assigned
 Type:               Bug
 Package:            SPL related
 Operating System:   *
 PHP Version:        5.2CVS-2008-07-22 (snap)
 Assigned To:        colder
 Block user comment: N
 Private report:     N

 New Comment:

The ArrayObject::STD_PROP_LIST doesn't seem to alter the behaviour of
ArrayObject in any noticeable way. Setting properties on an instance of
ArrayObject at runtime adds the properties to the instance, rather than
storing them as key/value pairs in the internal array. $o->prop = val is
a property with or without this flag and cannot be accessed via
$o['prop']



It would seem ArrayObject::ARRAY_AS_PROPS is what turns properties into
key/value pairs and allows you to access the key/value pairs as instance
properties. $o->prop = val is the same as $o['prop'] = val.





<?php

error_reporting(-1);

$a = array('first' => 'a');



// Build objects

$o1 = new ArrayObject($a                                                
         );

$o2 = new ArrayObject($a, ArrayObject::STD_PROP_LIST                    
         );

$o3 = new ArrayObject($a,                             
ArrayObject::ARRAY_AS_PROPS);

$o4 = new ArrayObject($a, ArrayObject::STD_PROP_LIST |
ArrayObject::ARRAY_AS_PROPS);



$ao = array($o1, $o2, $o3, $o4);



foreach($ao as $o) {

  // Add a property.

  $o->last = 'z';



  // Show flags, foreach() and properties.

  echo

    'Flags set to ', str_pad(decbin($o->getFlags()), 2, '0',
STR_PAD_LEFT), PHP_EOL,

    print_r($o, True), PHP_EOL,

    'Foreach:', PHP_EOL;

  

  foreach($o as $k => $v) {

    echo "  $k => $v", PHP_EOL;

  }



  echo

    'Properties:', PHP_EOL,

    "  first => {$o->first}", PHP_EOL,

    "  last => {$o->last}", PHP_EOL,

    PHP_EOL;

}

?>



outputs (using 5.3+) ...





Flags set to 00

ArrayObject Object

(

    [last] => z

    [storage:ArrayObject:private] => Array

        (

            [first] => a

        )



)



Foreach:

  first => a

Properties:



Notice: Undefined property: ArrayObject::$first in Z:\ar1.php on line
29

  first =>

  last => z



Flags set to 01

ArrayObject Object

(

    [last] => z

    [storage:ArrayObject:private] => Array

        (

            [first] => a

        )



)



Foreach:

  first => a

Properties:



Notice: Undefined property: ArrayObject::$first in Z:\ar1.php on line
29

  first =>

  last => z



Flags set to 10

ArrayObject Object

(

    [storage:ArrayObject:private] => Array

        (

            [first] => a

            [last] => z

        )



)



Foreach:

  first => a

  last => z

Properties:

  first => a

  last => z



Flags set to 11

ArrayObject Object

(

    [storage:ArrayObject:private] => Array

        (

            [first] => a

            [last] => z

        )



)



Foreach:

  first => a

  last => z

Properties:

  first => a

  last => z


Previous Comments:
------------------------------------------------------------------------
[2008-10-24 15:56:27] j...@php.net

Assigned to the SPL maintainer.

------------------------------------------------------------------------
[2008-07-22 17:02:41] robin_fernandes at uk dot ibm dot com

Description:
------------
The SPL documentation states that if the ArrayObject::STD_PROP_LIST 
flag is set on an ArrayObject instance:



  "Properties of the object have their normal functionality when
accessed as list (var_dump, foreach, etc.)"



(see
http://www.php.net/~helly/php/ext/spl/classArrayObject.html#daebe26f8478746da33c266a730714a9
)



This flag does affect var_dump(), but it seems to have no impact on
foreach. See reproduce code.



I'm not sure whether this is a functional problem or a documentation
problem.

Reproduce code:
---------------
<?php

// ArrayObject::STD_PROP_LIST:

// Properties of the object have their normal functionality when
accessed as list (var_dump, foreach, etc.)

  

echo "Create instance of ArrayObject and add some normal
properties...\n";

$ao = new ArrayObject(array('x', 'y', 'z'),
ArrayObject::STD_PROP_LIST);

$ao->p1 = 1;

$ao->p2 = 2;

$ao->p3 = 3;



echo "\nGet property list with var_dump:\n";

var_dump($ao);



echo "\nGet property list with foreach:\n";

foreach ($ao as $key=>$value) {

        echo "  $key=>$value\n";

}

?>

Expected result:
----------------
Create instance of ArrayObject and add some normal properties...



Get property list with var_dump:

object(ArrayObject)#1 (3) {

  ["p1"]=>

  int(1)

  ["p2"]=>

  int(2)

  ["p3"]=>

  int(3)

}



Get property list with foreach:

  p1=>1

  p2=>2

  p3=>3

Actual result:
--------------
Create instance of ArrayObject and add some normal properties...



Get property list with var_dump:

object(ArrayObject)#1 (3) {

  ["p1"]=>

  int(1)

  ["p2"]=>

  int(2)

  ["p3"]=>

  int(3)

}



Get property list with foreach:

  0=>x

  1=>y

  2=>z


------------------------------------------------------------------------



-- 
Edit this bug report at http://bugs.php.net/bug.php?id=45595&edit=1

Reply via email to