Skip to content

札记之引用诡异xdebug_debug_zval输出 #28

@diffnest

Description

@diffnest

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

  1. 代码如下:
<?php
	function test($b) {
            xdebug_debug_zval('b');
    }

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

    test($a);

结果如下:

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions