PHP中是否有一种方法可以确定给定变量是否是对另一个变量的引用和/或被另一个变量引用?考虑到php.net上的注释,设置可能$a=& $b意味着“ $ a和$ b在这里完全相等。 我可能会无法分开检测“对……的引用”和“对……的引用” 。$ a并不指向$ b或反之亦然。$ a和$ b指向同一位置。 ”
$a=& $b
如果无法确定给定变量是否是引用/引用,是否存在一种通用方法来确定两个变量是否是彼此引用?再次,对php.net 的注释提供了进行这种比较的功能- 尽管它涉及编辑一个变量并查看另一个变量是否受到类似影响。如果可能的话,我宁愿避免这样做,因为我正在考虑的某些变量大量使用了魔术getters / setters。
在这种情况下,请求的背景是编写调试功能以帮助详细查看结构。
您可以使用debug_zval_dump:
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在较低版本上引发级别错误。
E_STRICT
如果您想知道-4上面函数的来源:您告诉我…我是通过尝试得到的。在我看来,它应该仅为3(变量,函数中的变量,传递给的变量zend_debug_zval),但我不太擅长PHP的内部结构,似乎它会在途中的某个地方创建另一个引用;)
-4
zend_debug_zval