函数调用通过引用传递?

时间:2015-01-13 15:55:09

标签: php drupal-7 pass-by-reference

我在drupal CAS模块中看到了一些我并不完全理解的内容,245 of cas.module行:

  $initialized = &drupal_static(__FUNCTION__, FALSE);

前面有参考符号的功能怎么回事?我认为它只适用于变量。有人可以给我一个简单的解释吗?这样调用函数时会发生什么,$initialized的值是什么?

2 个答案:

答案 0 :(得分:1)

该函数的返回值为returned as a reference。从手册:

  

当您想要使用函数时,通过引用返回很有用   找到应该绑定引用的变量。不使用   按引用返回以提高性能。引擎会   自动优化它。

答案 1 :(得分:1)

Drupal使用该函数在单页加载期间缓存数据。它实际上可以像以下一样使用:

static $initialized = false;

只有通过使用中央存储并按功能名称保存变量记录,其他功能才能在页面请求期间访问(对于Drupal更重要,重置)该值。

Drupal如何使用它:

Jeff Eaton在Drupal 7中创建了一个nice blog post关于 drupal_static 和其他缓存技术。

假设另一个模块想要调用您的函数,因为您已将$initialized设置为true,您知道可以从缓存中获取数据。但是,如果其他模块不希望您缓存它呢?然后可以按如下方式重置静态变量:

$initialized = &drupal_static('your_module_your_function');
$initialized = false;

$freshData = your_module_your_function();

这可能不是最干净的模式,但这就是Drupal在许多地方的表现。

从PHP的角度来看它的作用:

使用此构造允许被调用函数通过引用而不是按值返回其值。为了做到这一点,被调用的函数也必须用和号定义,例如:

public function &getBar() {
    return $this->bar;
}

您甚至可以将它与参数by-reference结合使用。这样,您可以通过函数一直传递引用,这样当您更改返回值时,您也可以更改原始值。例如:

function &getRef(&$x) {
    return $x;
}

$a = 1;
$b = &getRef($a);
$b++;

echo $a; // Will output 2