直接的: 我想写一些代码来告诉变量是否通过引用传递。 例如:
<?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之间的区别,他们知道这是这个问题的解决方法。我可以做两个函数,但我想知道是否可以使用它。
提前致谢。
答案 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