函数调用通过引用传递


function call pass by reference?

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

  $initialized = &drupal_static(__FUNCTION__, FALSE);

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

函数的返回作为引用返回。从手册:

当您想要使用函数来 查找引用应绑定到哪个变量。请勿使用 按引用返回以提高性能。发动机将 自动优化它本身。

Drupal使用该函数在单个页面加载期间缓存数据。它实际上可以以与以下相同的方式使用:

static $initialized = false;

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

Drupal如何使用它:

Jeff Eaton 在 Drupal 7 中创建了一篇关于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;
}

您甚至可以将其与按引用的参数组合。这样,您就可以通过函数一直传递引用,这样当您更改返回值时,也会更改原始值。例如:

function &getRef(&$x) {
    return $x;
}
$a = 1;
$b = &getRef($a);
$b++;
echo $a; // Will output 2