|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2008-07-22 17:02 UTC] 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 PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Dec 01 02:00:01 2025 UTC |
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