Domanda

The constructors of PHP's ArrayIterator and ArrayObject have a flags parameter that is documented in ArrayObject::setFlags() as follows:

ArrayObject::STD_PROP_LIST

Properties of the object have their normal functionality when accessed as list (var_dump, foreach, etc.).

ArrayObject::ARRAY_AS_PROPS

Entries can be accessed as properties (read and write).

The documentation of ArrayIterator::setFlags() is similar (the difference being difference erroneous).

Now, I understand the second flag quite well, it allows property access with -> as well as array access with []:

$a = new ArrayIterator(array('foo'=>1), ArrayObject::ARRAY_AS_PROPS);
var_dump($a['foo']);
var_dump($a->foo);
int(1)
int(1)

But I cannot wrap my head around ArrayObject::STD_PROP_LIST. As far as I tested it, var_dump and foreach behave exactly the same with or without this flag. What am I missing here?

È stato utile?

Soluzione

As stated in the comments in the PHP manual the flag causes the properties, instead of the array values to be visible in var_dump.

Credits for this go to the commenter in the PHP manual:

<?php                                                    

$a = new ArrayObject(array(), ArrayObject::STD_PROP_LIST);
    $a['arr'] = 'array data';                            
    $a->prop = 'prop data';                              
$b = new ArrayObject();                                  
    $b['arr'] = 'array data';                            
    $b->prop = 'prop data';                              

// ArrayObject Object                                    
// (                                                     
//      [prop] => prop data                              
// )                                                     
print_r($a);                                             

// ArrayObject Object                                    
// (                                                     
//      [arr] => array data                              
// )                                                     
print_r($b);                                             

?>

This behaviour probably changed within never versions of PHP, as my version (5.4.6) of PHP always shows both: Properties and array values:

ArrayObject Object
(
    [prop] => prop data
    [storage:ArrayObject:private] => Array
        (
            [arr] => array data
        )

)
ArrayObject Object
(
    [prop] => prop data
    [storage:ArrayObject:private] => Array
        (
            [arr] => array data
        )

)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top