Edit report at https://bugs.php.net/bug.php?id=55406&edit=1
ID: 55406 User updated by: chrisstocktonaz at gmail dot com Reported by: chrisstocktonaz at gmail dot com Summary: get_object_vars and array casting when extending ArrayObject Status: Open Type: Bug Package: SPL related Operating System: Linux PHP Version: 5.4.0alpha3 Block user comment: N Private report: N New Comment: My expected result had a typo, "TestOne_1" would not exist in testtwo or testthree classes. Here is a patch for this: --- ext/spl/spl_array.c 2011-07-25 04:35:02.000000000 -0700 +++ ext/spl/spl_array.c 2011-08-11 13:38:52.000000000 -0700 @@ -746,7 +746,12 @@ { spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC); - return spl_array_get_hash_table(intern, 1 TSRMLS_CC); + HashTable *hh = zend_std_get_properties(object TSRMLS_CC); + HashTable *ht = spl_array_get_hash_table(intern, 1 TSRMLS_CC); + + zend_hash_merge(hh, ht, NULL, NULL, sizeof(zend_class_entry *), 0); + + return hh; } /* }}} */ static HashTable* spl_array_get_debug_info(zval *obj, int *is_temp TSRMLS_DC) /* {{{ */ Previous Comments: ------------------------------------------------------------------------ [2011-08-11 19:59:18] chrisstocktonaz at gmail dot com Description: ------------ As discussed on internals mailing list here [1], ArrayObject I think is overriding the get_properties handler in a bit to simple of a way. I think the ArrayObject should merge the spl hash with the default handler. [1] http://news.php.net/php.internals/54508 Test script: --------------- --Code class TestOne { public $TestOne_1 = 1; } class TestTwo extends ArrayObject { public $TestTwo_1 = 1; } class TestThree extends TestTwo { public $TestThree_1 = 1; } $t1 = new TestOne; var_dump((array) $t1, get_object_vars($t1)); $t2 = new TestTwo; var_dump((array) $t2, get_object_vars($t2)); $t3 = new TestThree; var_dump((array) $t3, get_object_vars($t3)); Expected result: ---------------- array(1) { ["TestOne_1"]=> int(1) } array(1) { ["TestOne_1"]=> int(1) } array(0) { // TestOne_1 // TestTwo_1 } array(0) { // TestOne_1 // TestTwo_1 } array(0) { // TestOne_1 // TestTwo_1 // TestThree_1 } array(0) { // TestOne_1 // TestTwo_1 // TestThree_1 } Actual result: -------------- array(1) { ["TestOne_1"]=> int(1) } array(1) { ["TestOne_1"]=> int(1) } array(0) { } array(0) { } array(0) { } array(0) { } ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=55406&edit=1