如何检查变量是否在PHP中通过引用传递

时间:2014-02-22 18:33:46

标签: php reference

直接的: 我想写一些代码来告诉变量是否通过引用传递。 例如:

<?php
function isReference($variable) {
    //return TRUE if &$something was passed
    //return FALSE if $something was passed
}
$text = 'Anything';
$a = isReference(&$text); //return TRUE
$b = isReference($test); //return FALSE
?>

对于那些好奇的人 - 我为什么需要它? 首先,我不想留下未解决的问题。 其次,我目前通过编写mysqli的扩展来增强技能,这将扩展类似于PDO的方式。如果有人知道PDO中bindParam和bindValue之间的区别,他们知道这是这个问题的解决方法。我可以做两个函数,但我想知道是否可以使用它。

提前致谢。

3 个答案:

答案 0 :(得分:5)

这是一种不使用debug_zval_dump函数的方法:

function isReference($variable) {
    $variable = array($variable);
    $arg = func_get_arg(0);
    $isRef = isset($arg[0]) && $arg === array($variable[0]);
    $variable = $variable[0];

    return $isRef;
}

注意:只有一个案例不起作用:

$text = array(&$text); // although i don't see why such a structure could be used
isReference($text); // will wrongly return false

显然,您可以使用随机唯一键(而不是0)来绕过此限制。

答案 1 :(得分:0)

您可以使用debug_zval_dump转储内部zend值的字符串表示形式来输出:

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

$var1 = 'Var1';
$var2 = &$var1; // passed by ref
if(isRef($var2)) echo 'Passed by ref';

但要注意PHP - 5.4

答案 2 :(得分:0)

只是检查默认值似乎在我的测试中正常工作。显然,如果$t已设置为'x',它将无效,但您可以将默认值更改为完全不可能解决此问题的内容:

function test(&$t='x'){
   if($t!='x') $t = 2;
}
test();   echo $t;  //outputs: null
test($t); echo $t;  //outputs: 2