2

PHP のコンストラクターには、次のように文書化されArrayIteratorArrayObjectいるflagsパラメーターがあります。ArrayObject::setFlags()

ArrayObject::STD_PROP_LIST

オブジェクトのプロパティは、リスト (var_dump、foreach など) としてアクセスした場合、通常の機能を持ちます。

ArrayObject::ARRAY_AS_PROPS

エントリはプロパティとしてアクセスできます (読み取りおよび書き込み)。

ArrayIterator::setFlags() のドキュメントも同様です (違いは間違いです)。

これで、2 番目のフラグをよく理解できました。これにより、プロパティ アクセスと->配列アクセスが可能になり[]ます。

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

しかし、私は頭を包むことができませんArrayObject::STD_PROP_LIST。私がテストした限り、このフラグの有無にかかわらずまったく同じように動作しますvar_dumpforeachここで何が欠けていますか?

4

1 に答える 1

1

PHPマニュアルのコメントに記載されているように、フラグにより​​、配列値の代わりにプロパティがに表示されvar_dumpます。

このクレジットは、PHPマニュアルのコメント投稿者に送られます。

<?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);                                             

?>

私のバージョン(5.4.6)のPHPは常に次の両方を表示するため、この動作はおそらくPHPの決してないバージョン内で変更されました。プロパティと配列値:

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

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

)
于 2013-02-16T13:12:22.897 に答える