如何从函数内部确定传递给它的变量是否通过引用?

时间:2011-06-22 08:08:33

标签: php php-5.3

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 '&'

5 个答案:

答案 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;
}

它应该完全按照您在问题中提出的要求进行操作

我不知道控制传递参数是一个引用的任何好的和安全的方法,而不仅仅是在运行时函数体内的值。