29

ドキュメントで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 ) )

この定数を使用するかどうかの違いは何ですか?

前もって感謝します!

4

2 に答える 2

87

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

STD_PROP_LIST、読み方と、ARRAY_AS_PROPSそれらの要素の書き方を教えてくれます。まず、標準の配列([])表記による要素の設定は、これらの設定に関係なく、常に同じように機能します。

フラグを設定ARRAY_AS_PROPSする場合、(を介して)プロパティを設定->すると、通常のオブジェクトで期待されるようにオブジェクトに設定されるのではなく、内部要素として保存されることを意味します。このフラグが設定されていない場合、プロパティは実際の配列オブジェクトまたは配列イテレータに格納されます。これは、例から出力されたコードに表示されます。「prop => propdata」は、の内部にありませんstorage:ArrayObject:privateARRAY_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に設定されているプロパティが返されます。設定されていない場合は、保存されている内部要素のリストを返します。ArrayObjectArrayIteratorvar_dump()

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

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

于 2013-05-17T23:21:07.753 に答える
0

@JayTaphによる素晴らしい答えですがprint_r、デバッグ関数のようなものです。たとえば、実際にアレイを使用するforeachと、両方が大幅に異なることが明らかになります。

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

echo "\$a:<br>\n";
foreach( $a as $key=> $value) {
  printf( "[%s] : %s<br>\n", $key, $value);
}

echo "\$b:<br>\n";
foreach ($b as $key => $value) {
  printf("[%s] : %s<br>\n", $key, $value);
}

出力します:

$a:
[arr] : array data
$b:
[arr] : array data
[prop] : prop data
于 2021-11-17T12:02:45.287 に答える