web-dev-qa-db-ja.com

Spl、ArrayObject、ArrayObject :: STD_PROP_LIST

ドキュメントでSTD_PROP_LIST定数を理解しようとしていますが、これまでのところ理解できず、説明も見つかりませんでした:(ドキュメントには次の例があります。

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

どちらのプリントでも、まったく同じ結果が得られます。

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

この定数を使用するかどうかの違いを理解するのを手伝ってくれる人はいますか?

前もって感謝します!

23
Fried Smurf

ArrayObjectArrayIteratorは、非常によく似た2つのクラスです。実際には、どちらもphpコアの内部で多くのコードを共有しています。これらの2つのクラスには、これらのクラスに設定した要素を格納するための内部配列があります。

_STD_PROP_LIST_は読み取り方法を示し、_ARRAY_AS_PROPS_はそれらの要素の記述方法を示します。まず、標準配列(_[]_)表記による要素の設定は、これらの設定に関係なく、常に同じように機能します。

_ARRAY_AS_PROPS_フラグを設定する場合、(_->_を介して)プロパティを設定すると、通常のオブジェクトで期待されるようにオブジェクトに設定されず、内部要素として保存されることを意味します。このフラグが設定されていない場合、プロパティは実際の配列オブジェクトまたは配列イテレータに格納されます。これは、例のコード出力に表示されます。「_prop => propdata_」は_storage:ArrayObject:private_、これは_ARRAY_AS_PROPS_フラグが設定されている場合に当てはまります。

_$a = new ArrayObject();
$a['arr'] = 'array data';
$a->prop = 'prop data';

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

print_r($a);
print_r($b);

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

_STD_PROP_LIST_は、特定の条件、特にvar_dump()で何を返すかを決定します。他のケースもありますが、私自身は見つけていません。 _STD_PROP_LIST_が設定されている場合は、ArrayObjectまたはArrayIteratorクラスに設定されているプロパティが返されます。設定されていない場合、var_dump()は保存されている内部要素のリストを返します。

実際のドキュメントは_STD_PROP_LIST_で100%正確ではありません。このフラグはvar_dump()に影響しますが、foreach()には影響しません。 foreach()を使用すると、_STD_PROP_LIST_が設定されている場合でも、常に内部要素が繰り返され、実際のプロパティは繰り返されません。

これらの2つのフラグは相互に排他的ではありません。両方のフラグを設定できますが、そうしても意味がありません。つまり、プロパティは常に内部要素(_ARRAY_AS_PROPS_)として追加され、標準を返したいということです。 _var_dump_(_STD_PROP_LIST_)を介したプロパティ。プロパティを設定することはできないため、その場合は常に空のリストが返されます。

71
JayTaph