函数调用通过引用传递?
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
我在 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