雖然與Xdebug的的引用計數功能發揮,我碰到這種奇怪的行爲:PHP的foreach如何處理引用?
$a = array('foo', 'bar');
xdebug_debug_zval('a');
foreach ($a as $key => $s) {
xdebug_debug_zval('a');
echo "$s\n";
unset($a[$key]);
xdebug_debug_zval('a');
}
輸出是:
a: (refcount=1, is_ref=0)=array (0 => (refcount=1, is_ref=0)='foo', 1 => (refcount=1, is_ref=0)='bar')
a: (refcount=3, is_ref=0)=array (0 => (refcount=2, is_ref=0)='foo', 1 => (refcount=1, is_ref=0)='bar')
foo
a: (refcount=1, is_ref=0)=array (1 => (refcount=2, is_ref=0)='bar')
a: (refcount=1, is_ref=0)=array (1 => (refcount=3, is_ref=0)='bar')
bar
a: (refcount=1, is_ref=0)=array()
爲什麼的a
refcount
跳起來三個?也許是因爲每個本地$s
都保留一個參考?如果這是保存的情況?然後我發現refcount
對於數組的第一個或第二個項目增加1,具體取決於正在執行的循環。但是爲什麼第二個項目的refcount
在我取消第一個項目後增加了一個?
顯然,現在我要實現的目標是:
$a = array('foo', 'bar');
xdebug_debug_zval('a');
$tot = count($a);
for ($i = 0; $i < $tot; $i++) {
xdebug_debug_zval('a');
echo $a[$i]."\n";
unset($a[$i]);
xdebug_debug_zval('a');
}
其中有這樣的輸出:
a: (refcount=1, is_ref=0)=array (0 => (refcount=1, is_ref=0)='foo', 1 => (refcount=1, is_ref=0)='bar')
a: (refcount=1, is_ref=0)=array (0 => (refcount=1, is_ref=0)='foo', 1 => (refcount=1, is_ref=0)='bar')
foo
a: (refcount=1, is_ref=0)=array (1 => (refcount=1, is_ref=0)='bar')
a: (refcount=1, is_ref=0)=array (1 => (refcount=1, is_ref=0)='bar')
bar
a: (refcount=1, is_ref=0)=array()
是否有可能實現使用foreach
這樣的結果?
本文不提‘的foreach’,但在解釋PHP引用詳情。比我們大多數人需要的更詳細,但似乎相當完整; -/[PHP引用解釋](http://derickrethans.nl/talks/phparch-php-variables-article.pdf) –