【问题标题】:How does PHP's foreach handle references?PHP 的 foreach 如何处理引用?
【发布时间】: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 ()

为什么refcounta 最多跳到三个?也许是因为每个本地 $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


【解决方案1】:

此外,如果您只想使用引用,则只需在处理 variable.strong 文本之前添加“&”(与号)符号

【讨论】:

    【解决方案2】:

    尝试以下操作以了解后台发生的情况:

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

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

    【讨论】:

      猜你喜欢
      • 2016-02-01
      • 1970-01-01
      • 2014-05-14
      • 2013-08-25
      • 2015-07-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2017-01-24
      相关资源
      最近更新 更多