【发布时间】:2014-04-16 16:59:54
【问题描述】:
在使用 xdebug 的引用计数功能时,我遇到了这种奇怪的行为:
$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 ()
为什么refcount 的a 最多跳到三个?也许是因为每个本地 $s 都保留了对它的引用?如果是这种情况,它保存在哪里?然后我看到refcount 对于数组的第一项或第二项增加了一个,具体取决于正在执行的循环。但是为什么我取消第一项后,第二项的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 references explained
标签: php foreach reference xdebug