札记之引用诡异xdebug_debug_zval输出

最近在看xdebug_debug_zval,遇到一诡异问题,记录下:

  1. 代码如下:
1
2
3
4
5
6
7
8
9
<?php
function test($b) {
xdebug_debug_zval('b');
}

$a = 1;
xdebug_debug_zval('a');

test($a);

结果如下:

1
2
a: (refcount=1, is_ref=0)=1
b: (refcount=3, is_ref=0)=1

问题就在这,当我们都以为内部b:(refcount=2)的时候突然变成了3,在经过一番查找,以及咨询大牛康神之后,最终给出了答案;

  1. 执行过程:
    1.1 我们将1赋给变量$a;这个时候xdebug_debug_zval(‘a’);的输出是refcount=1,然后将$a变量传递给test();
    1.2 当我们将$a传递给test()时,其实我们可以把test($b)看做是一个整体,只是$b存储在不同的符号表中(test函数符号表),这个时候引用计数加2,并不是加1,原因是因为这个函数符号表(函数栈)也包含了这个变量容器的引用;

待续~

附图一张:
default

参考链接:http://www.phppan.com/tag/refcount/
英文原文地址:http://derickrethans.nl/files/phparch-php-variables-article.pdf

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!