函数调用通过引用传递?

function call pass by reference?

我在 drupal CAS 模块中看到一些我没有完全理解的东西,第 245 of cas.module 行:

  $initialized = &drupal_static(__FUNCTION__, FALSE);

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

函数的 return 是 returned as a reference。来自手册:

Returning by reference is useful when you want to use a function to find to which variable a reference should be bound. Do not use return-by-reference to increase performance. The engine will automatically optimize this on its own.

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

static $initialized = false;

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

Drupal 的使用方式:

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

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

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

$freshData = your_module_your_function();

这可能不是最干净的模式,但 Drupal 在很多地方都是这样做的。

从 PHP 的角度来看它做了什么:

使用此构造允许被调用函数 return 通过引用而不是通过值来获取其值。为了这样做,被调用的函数也必须用一个符号来定义,例如:

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

您甚至可以通过引用将它与参数结合起来。这样你就可以通过一个函数一直传递一个引用,这样当你改变 returned 值时,你也改变了原始值。例如:

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

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

echo $a; // Will output 2