Edit report at https://bugs.php.net/bug.php?id=55495&edit=1
ID: 55495 User updated by: roan dot kattouw at gmail dot com Reported by: roan dot kattouw at gmail dot com Summary: Issues with numeric string keys in objects Status: Wont fix Type: Bug Package: Class/Object related Operating System: Ubuntu Natty PHP Version: 5.4.0alpha3 Block user comment: N Private report: N New Comment: First of all, this is about objects, not arrays. In arrays, the messed-up string-but-looks-like-a-number keys are still accessible, both through ["2"] and [2], but in objects they're completely inaccessible. The object member is there according to var_dump() but the only way to get its value is to cast the object to an array. Second, I don't see how a "known issue" is "wontfix". That sounds like a direct contradiction to me. Previous Comments: ------------------------------------------------------------------------ [2011-08-24 04:06:53] larue...@php.net it's a known issue, there is only number key in array if it is ('looks like') a number. ------------------------------------------------------------------------ [2011-08-23 15:31:21] roan dot kattouw at gmail dot com Description: ------------ If you have an object with numeric string keys such as "1", serialize() and unserialize() will not round-trip cleanly: if $foo = array("1" =>"foo"), unserialize(serialize($foo)) will be array(1=>"foo"). I'm not actually sure this is a bug in serialize()/unserialize(); it seems to be a bug in json_decode() instead. Somewhat counter-intuitively, arrays or objects with numeric string keys are really hard to produce. Constructs like array("1"=>"foo") or even $s = "1"; $arr[$s] = "foo"; produce an array with int(1) as the key rather than string("1"). The same is true for objects. The only thing that produces numeric string keys, AFAIK, is json_decode(). A very related bug, and the reason I noticed this in the first place, is that if you have an object with numeric keys and set $s = "2" , $obj->{$s} will not return the value for key 2. Worse, it seems there's no way to access the value short of casting the object to an array and using $arr[2]. Related bugs have been filed and closed, but they don't seem to have addressed this issue properly: #48557: patch applied to 5.2 and 5.3; I found this bug in 5.4 #48171: basically the same problem, marked as bogus referring to #48959 , which is about arrays not objects. It claims to have been documented in the manual, but again that refers to arrays not objects Test script: --------------- <?php error_reporting(E_ALL); $s = "2"; $i = 2; $foo = json_decode('{"1":"foo","2":"bar"}'); $ser = serialize($foo); $bar = unserialize($ser); var_dump($foo); var_dump($ser); var_dump($bar); var_dump($foo->{$s}); var_dump($foo->{$i}); var_dump($bar->{$s}); var_dump($bar->{$i}); Expected result: ---------------- object(stdClass)#1 (2) { ["1"]=> string(3) "foo" ["2"]=> string(3) "bar" } string(55) "O:8:"stdClass":2:{s:1:"1";s:3:"foo";s:1:"2";s:3:"bar";}" object(stdClass)#2 (2) { ["1"]=> string(3) "foo" ["2"]=> string(3) "bar" } string(3) "bar" string(3) "bar" string(3) "bar" string(3) "bar" Actual result: -------------- object(stdClass)#1 (2) { ["1"]=> string(3) "foo" ["2"]=> string(3) "bar" } string(55) "O:8:"stdClass":2:{s:1:"1";s:3:"foo";s:1:"2";s:3:"bar";}" object(stdClass)#2 (2) { [1]=> string(3) "foo" [2]=> string(3) "bar" } string(3) "bar" string(3) "bar" Notice: Undefined property: stdClass::$2 in /home/catrope/php-5.4.0alpha3/testcase.php on line 13 NULL Notice: Undefined property: stdClass::$2 in /home/catrope/php-5.4.0alpha3/testcase.php on line 14 NULL ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=55495&edit=1