一尘不染

检测PHP变量是否为引用/引用

php

PHP中是否有一种方法可以确定给定变量是否是对另一个变量的引用和/或被另一个变量引用?考虑到php.net上的注释,设置可能$a=& $b意味着“ $ a和$ b在这里完全相等。 我可能会无法分开检测“对……的引用”和“对……的引用” 。$ a并不指向$ b或反之亦然。$ a和$
b指向同一位置。

如果无法确定给定变量是否是引用/引用,是否存在一种通用方法来确定两个变量是否是彼此引用?再次,对php.net
注释提供了进行这种比较的功能-
尽管它涉及编辑一个变量并查看另一个变量是否受到类似影响。如果可能的话,我宁愿避免这样做,因为我正在考虑的某些变量大量使用了魔术getters /
setters。

在这种情况下,请求的背景是编写调试功能以帮助详细查看结构。


阅读 313

收藏
2020-05-29

共1个答案

一尘不染

您可以使用debug_zval_dump

function countRefs(&$var) {
    ob_start();
    debug_zval_dump(&$var);
    preg_match('~refcount\((\d+)\)~', ob_get_clean(), $matches);
    return $matches[1] - 4;
}

$var = 'A';
echo countRefs($var); // 0

$ref =& $var;
echo countRefs($var); // 1

从PHP 5.4开始,这不再起作用,因为他们删除了通过引用支持传递的调用时间,并可能E_STRICT在较低版本上引发级别错误。

如果您想知道-4上面函数的来源:您告诉我…我是通过尝试得到的。在我看来,它应该仅为3(变量,函数中的变量,传递给的变量zend_debug_zval),但我不太擅长PHP的内部结构,似乎它会在途中的某个地方创建另一个引用;)

2020-05-29