|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2020-11-19 09:33 UTC] anton at rudnikov dot net
Description:
------------
I pass an object to ArrayObject constructor, and trying to access its properties. I can access string properties, but I can't access numeric one
Test script:
---------------
<?php
$object = new stdClass;
$object->prop = 'test1';
$object->{'1'} = 'test2';
$arrayObject = new ArrayObject($object);
echo $arrayObject['prop']; // test1
echo $arrayObject['1']; // Undefined index
$arrayObject = new ArrayObject($object, ArrayObject::ARRAY_AS_PROPS);
echo $arrayObject->prop; // test1
echo $arrayObject->{'1'}; // Undefined index
Expected result:
----------------
test1
test2
test1
test2
Actual result:
--------------
test1
Notice: Undefined index: 1 in /in/9UdHs on line 9
test1
Notice: Undefined index: 1 in /in/9UdHs on line 13
PatchesPull Requests
Pull requests:
HistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Oct 27 17:00:01 2025 UTC |
There's also interesting behaviour when I try to get array copy from ArrayObject using method getArrayCopy. Test script: --------------- <?php $object = new stdClass(); $object->prop = 'test1'; $object->{'1'} = 'test2'; $arrayObject = new ArrayObject($object); $arrayCopy = $arrayObject->getArrayCopy(); var_dump($arrayCopy[1], $arrayCopy['1']); // can't access numeric property on array copy $array = (array) $object; var_dump($array[1], $array['1']); // but it works if I just cast stdClass to array var_dump($arrayCopy, $array); // let's see differences between arrays Actual result: -------------- Notice: Undefined offset: 1 in /tmp/preview on line 8 Notice: Undefined offset: 1 in /tmp/preview on line 8 NULL NULL string(4) "test" string(4) "test" array(1) { ["1"]=> string(4) "test" } array(1) { [1]=> string(4) "test" }Yes, that is another instance of the same root cause, which is that ArrayObject treats object properties ("proptables") as arrays ("symtables"). Yet another instance: <?php $object = new stdClass; $object->{'1'} = 'test1'; $arrayObject = new ArrayObject($object); $arrayObject['2'] = 'test2'; var_dump($object); ?> We have just created an inaccessible numeric property on the stdClass instance. It seems to me that the fix is not trivial, and that it might break some existing code. As such, I don't think this should be fixed for any stable PHP version, but rather documented.