PHP的foreach如何处理引用?

时间:2014-03-12 13:48:16

标签: php foreach reference xdebug

在玩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的{​​{1}}会跳到三个?也许是因为每个本地a都会引用它?如果这是保存的情况?然后我看到$s对于数组的第一项或第二项增加1,具体取决于正在执行的循环。但是,在我取消第一项之后,为什么第二项的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 () 来实现此结果?

2 个答案:

答案 0 :(得分:0)

尝试以下方法来处理后台发生的事情:

print_r(array_keys(get_defined_vars()));
print_r(array_values(get_defined_vars()));

它将在脚本中的任何给定点输出所有已分配的变量。尝试将其移动到文件中的不同点。查看更改并相应地进行调整。

答案 1 :(得分:0)

此外,如果您只想使用参考文献,那么您只需在处理变量。强文本之前添加&#34;&amp;&#34;(&符号)符号