当前位置: 首页 > 面试题库 >

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

百里沛
2023-03-14
问题内容

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

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

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


问题答案:

您可以使用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的内部结构,似乎它会在途中的某个地方创建另一个引用;)



 类似资料:
  • 问题内容: 确定JavaScript中的变量是否为数组的最佳事实标准跨浏览器方法是什么? 在网络上搜索时,有很多不同的建议,其中有些是好的,有些是无效的。 例如,以下是基本方法: 但是,请注意,如果数组为空,或者obj实际上不是数组,但是实现了length属性,将会发生什么情况。 那么,从实际工作,跨浏览器和仍有效执行的角度来看,哪种实现是最佳的呢? 问题答案: JS中对象的类型检查是通过完成的,

  • 问题内容: PHP变量是通过值还是通过引用传递? 问题答案: 根据PHP文档的价值。 默认情况下,函数参数是按值传递的(因此,如果函数中参数的值发生更改,则不会在函数外部进行更改)。要允许函数修改其参数,必须通过引用将其传递。 有一个参数总是通过引用传递函数,在前面加上符号( & ),以在函数定义的参数名称。

  • 问题内容: 我有以下代码 我将用它来查看数据库的不同“页面”(结果1-10、11-20等)。但是,我似乎无法使is_int()函数正常工作。在网址(noobs.php?p = 1)中输入“ 1”会给我无效的页面错误,以及类似“ asdf”的错误。 问题答案: 使用检查,如果一个变量是一个整数是一个坏主意。该函数将返回用于例如。这不是预期的行为。 要正确执行此操作,可以使用以下选项之一: 考虑此变量

  • 问题内容: 有什么最短的方法吗? 如果我是正确的,应该用? 有可能,并且在一行中写(也许是数组?)而不重复? 问题答案: 如果要测试变量是否 确实 是,请使用标识运算符: 如果要检查是否未设置变量: 或者,如果变量不为空,则为空字符串,零,..: 如果要测试变量是否不是空字符串,也将足够:

  • 我想检查变量是否为空: 此代码基于:https://www.thomasmaurer.ch/2010/07/powershell-check-variable-for-null/,但这不起作用。 我该怎么解决这个问题? ps。堆栈中有东西

  • 问题内容: 我有一个变量,我想知道它是否指向一个函数。 我曾希望我可以做些类似的事情: 但这给了我: 我选择的原因是 问题答案: 如果这是用于Python 2.x或Python 3.2+,则也可以使用。它曾经不推荐使用,但是现在不推荐使用,因此你可以再次使用它。你可以在此处阅读讨论内容:http : //bugs.python.org/issue10518。你可以执行以下操作: 如果这是针对Pyt