Edit report at https://bugs.php.net/bug.php?id=55406&edit=1

 ID:                 55406
 Comment by:         RQuadling 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:

Adding ...

 public function __construct (array $input = array(), $flags = 
ArrayObject::STD_PROP_LIST, $iterator_class = 'ArrayIterator') {
  parent::__construct($input, $flags, $iterator_class); 
 }

as the constructor for TestTwo will output ...

array(1) {
  ["TestOne_1"]=>
  int(1)
}
array(1) {
  ["TestOne_1"]=>
  int(1)
}
array(1) {
  ["TestTwo_1"]=>
  int(1)
}
array(1) {
  ["TestTwo_1"]=>
  int(1)
}
array(2) {
  ["TestThree_1"]=>
  int(1)
  ["TestTwo_1"]=>
  int(1)
}
array(2) {
  ["TestThree_1"]=>
  int(1)
  ["TestTwo_1"]=>
  int(1)
}

So, is this a bug?

Dox says ...
"ArrayObject::STD_PROP_LIST 
Properties of the object have their normal functionality when accessed as list 
(var_dump, foreach, etc.)."

So, without this flag (a bitmask) being set, the "properties" aren't accessible 
in the way you think they should be.


Previous Comments:
------------------------------------------------------------------------
[2011-08-11 20:41:44] chrisstocktonaz at gmail dot com

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) 
/* {{{ */

------------------------------------------------------------------------
[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

Reply via email to