Edit report at http://bugs.php.net/bug.php?id=51682&edit=1
ID: 51682 Comment by: ptacek dot pavel at gmail dot com Reported by: david at grudl dot com Summary: (array) casting and numeric keys Status: Open Type: Bug Package: Arrays related PHP Version: Irrelevant New Comment: Test 1: -------- class Test { protected $25twentyFive; } Expected result: Parse error. Actual result: Parse error. Test 2: -------- $obj = new stdClass; $obj->{25} = 'test assign as-integer'; $arr = (array) $obj; $arr[25] = 'test assign into array, with integer'; var_dump($arr); Expected result 2: ------------------- Parse error (since numeric variables are not compliant; when doing $obj->25 i get an parse error) Actual result 2: ----------------- array(2) { ["25"]=> string(22) "test assign as-integer" [25]=> string(36) "test assign into array, with integer" } Test 3: -------- $obj = new stdClass; $twentyFive = 25; $obj->$twentyFive = 'test assing with integer'; $arr = (array) $obj; $arr[$twentyFive] = 'test assign into array'; var_dump($arr); Expected result 3: ------------------- array(1) { [25]=> string(22) "test assign into array" } OR notice. Actual result 3: ----------------- array(2) { ["25"]=> string(24) "test assing with integer" [25]=> string(22) "test assign into array" } Proposed solution: ------------------- When doing: $twentyFive = 25; $obj->$twentyFive = 'some string'; php should raise a notice When doing: $obj->{25} = 'some string'; php should raise an error. Previous Comments: ------------------------------------------------------------------------ [2010-04-28 17:04:03] pavel dot lisa at centrum dot cz I'd say there is no error in the way PHP handles this, as you are accessing $obj->{'10'} by a string key ( '10' === "10" => true ). $obj = new stdClass; $obj->{"10"} = 'as string'; $arr = (array) $obj; $arr["10"] = 'as string again'; var_dump($arr); would then produce something like array(1) { ["10"]=> string(10) "as string again" } ------------------------------------------------------------------------ [2010-04-28 15:30:25] david at grudl dot com Description: ------------ Casting to (array) handles numeric keys wrong way: Test script: --------------- $obj = new stdClass; $obj->{'10'} = 'as string'; $arr = (array) $obj; $arr[10] = 'as integer'; var_dump($arr); Expected result: ---------------- array(1) { [10]=> string(10) "as integer" } Actual result: -------------- array(2) { ["10"]=> string(9) "as string" [10]=> string(10) "as integer" } ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=51682&edit=1