function do_sth_with_var($variable) {
if (is_by_reference($variable)) {
$variable = something($variable)
}
else {
return something($variable);
}
}
所以例如,如果'某事'是strtoupper:
do_sth_with_var(&$str); // would make $str uppercase, but
$str = do_sth_with_var($str); // that way should it be done if ommitting that '&'
答案 0 :(得分:3)
免责声明:这不直接回答OP的问题,但我提供这个答案,希望能帮助他/她。
我会说,提供一致的界面。声明函数参数作为参考:
function do_sth_with_var(&$variable) {
它始终是一个参考。
您也可以相反并始终复制值:
function do_sth_with_var($variable) {
$val = $variable;
// work with $val here
return $val;
}
我知道没有内置的PHP函数会根据您是否传递引用来更改其行为。它们被明确定义为将参数视为参考或不参与,我认为用户习惯于这个明确的定义并且可以处理它们。
例如,sort
始终对数组进行排序。你知道的。因此,如果您想保留原文,请在通话前复制一份。
取决于您的功能是否有意义执行就地操作。例如。它对sort
有意义,但我认为它对字符串处理没有意义。
此外,当您使用PHP 5.3时,passing variables by reference at call-time is deprecated:
从PHP 5.3.0开始,当您在
&
中使用foo(&$a);
时,系统会收到一条警告,指出“调用时间传递参考”已被弃用。
所以你(或任何人)不应该这样做。
答案 1 :(得分:1)
calltime-pass-by-ref自5.3起被视为已弃用。
除此之外......在学术上回答这个问题;我不认为有任何方法可以确定,b / c“参考”和通常参数之间没有区别。在PHP中,每个变量都是指向符号表中节的指针。引用只是使另一个变量指向同一部分。
PHP中的没有引用,例如C知道它们。每个变量都是指针和每个“引用”。
PS:@Gordon:我忘记了Reflection-Classes。当然,他们在元级别上工作。我的答案更多地针对PHP如何实际处理参数和变量。
答案 2 :(得分:0)
第一条评论here(官方php手册)
很好地涵盖了这个主题答案 3 :(得分:0)
从字面上回答您的问题,您可以尝试使用debug_zval_dump进行试验。通过val和参考参数,Refcounts将有所不同。
function xxx($a) {
debug_zval_dump($a);
}
$b = 123;
xxx($b); // long(123) refcount(4)
xxx(&$b); // long(123) refcount(1)
答案 4 :(得分:-1)
在您的特定情况下,您不需要知道值是否通过引用传递,您可以执行以下操作:
function do_sth_with_var($variable) {
$variable = something($variable)
return $variable;
}
它应该完全按照您在问题中提出的要求进行操作
我不知道控制传递参数是一个引用的任何好的和安全的方法,而不仅仅是在运行时函数体内的值。