【发布时间】:2017-03-09 07:05:57
【问题描述】:
看了很多关于如何在机器Zend内部构造变量的文章,发现了一件我无法解释的有趣的事情:
$int = 100;
xdebug_debug_zval('int'); /// int:(refcount=1,is_ref=0),int 100
$int = &$int;
xdebug_debug_zval('int'); /// int:(refcount=1,is_ref=1),int 100
事实证明,我们正在创建自身的链接?这怎么可能?
根据我所知清除信息:
通常is_ref = 1 仅当容器引用 zval 两个或多个硬链接变量时。
refcount - 是引用同一个 zval 容器的变量数量,但不同之处在于 is_ref = 0 和 is_ref = 1 的引用计数不同。
如果is_ref = 0和refcount > 1在创建硬链接时,我们会得到一个新的zval容器,如果我们通过一个值进行赋值-不会创建新的zval容器。
如果is_ref = 1和refcount > 1在创建硬链接时没有创建新的zval,使用旧的。如果我们不创建硬链接,而是按值分配 - 这意味着我们创建了新的 zval 容器。
P.S 我写这篇文章是为了表明理解我问的问题,并说明为什么我不理解我上面写的代码的行为
【问题讨论】:
-
@RyanVincent 这可能吗?我怎样才能建立到同一个变量的硬链接,即它本身
-
@RyanVincent 我不明白你的意思。我知道一个变量拥有一个 zval 容器
-
也许很有趣? PHP5 References Explained Visually。以后更容易理解。
-
@RyanVincent 我读了你的手册。但我的邪恶问题没有得到答案 -
$int = &$int- 什么???这是? -
@RyanVincent 但在我的情况下它并没有增加
refcount,她仍然是 1