我在cas.module的第245行drupal CAS模块中看到了一些我并不完全理解的东西:
$initialized = &drupal_static(__FUNCTION__, FALSE);
具有参考符号的函数在它之前发生了什么? 我认为它只适用于变量。 有人可以给我一个简单的解释吗? 这样调用函数时会发生什么,$initialized的值是多少?
请看这里stackoverflow.com/questions/4355300/和这里的php.net/manual/en/language.references.return.php
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;
}
您甚至可以将它与参数by-reference结合起来。这样,您可以通过函数一直传递引用,这样当您更改返回值时,您也可以更改原始值。例如:
function &getRef(&$x) {
return $x;
}
$a = 1;
$b = &getRef($a);
$b++;
echo $a; // Will output 2
函数返回作为参考返回。从手册:
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.