7

配列に対していくつかの簡単なデバッグテストを実行したところ、配列のvar_dump()を実行すると、出力が別の変数によって参照されている配列内の要素にフラグを立てていることに気付きました。簡単な実験として、次のコードを実行しました。

$array = range(1,4);

var_dump($array);
echo '<br />';

foreach($array as &$value) {
}

var_dump($array);
echo '<br />';

$value2 = &$array[1];

var_dump($array);
echo '<br />';

これにより、次の出力が得られます。

array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) } 
array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> ∫(4) } 
array(4) { [0]=> int(1) [1]=> ∫(2) [2]=> int(3) [3]=> ∫(4) } 

要素3とそれに続く要素1の横にある∫記号に注意してください。これらのエントリはエントリのデータ型を示していないことにも注意してください。

いくつかの実験の後、スカラー型をvar_dumpした場合、またはオブジェクトやリソースを使用した場合、これはわかりません。配列に文字列データが含まれている場合、シンボルは&であり(データ型は引き続き表示されます)、float、boolean、およびobjectのエントリも同様です。

これはPHP5.2.8に対して実行されています

最初の質問:この動作はいつ始まりましたか、それとも今まで気づかなかったものですか?

2番目の質問:参照される要素にvar_dump()によってこの方法でフラグを立てることができる場合、配列要素が別の変数によって参照されているかどうかを識別できる関数がコアPHPにありますか。または、_zval_structからrefcountまたはrefフラグを返しますか?

4

1 に答える 1

5

これがあなたの質問に答えるかどうかはわかりませんが、あなたは使うことができます

debug_zval_dump($array);

refcountを取得するには:

array(4) refcount(2){ 
    [0]=> long(1) refcount(1) 
    [1]=> &long(2) refcount(2) 
    [2]=> long(3) refcount(1) 
    [3]=> &long(4) refcount(2) 
} 

Refcountingについては、Derick Rethans(PHP Core Dev)によるこの記事も参照してください。

于 2010-11-16T12:29:22.707 に答える