В модуле drupal CAS я увидел кое-что, чего не понял 245 из cas.module:
$initialized = &drupal_static(__FUNCTION__, FALSE);
Что происходит с функцией, перед которой стоит символ ссылки? Я думал, что это может работать только с переменными. Может кто-нибудь дать мне простое объяснение этого? Что происходит, когда функция вызывается таким образом, и какова ценность $initialized
?
Возврат из функции возвращается в качестве ссылки. Из руководства:
Возврат по ссылке полезен, когда вы хотите использовать функцию для
найдите, к какой переменной должна быть привязана ссылка. Не использовать
возврат по ссылке для увеличения производительности. Двигатель будет
автоматически оптимизировать это самостоятельно.
Drupal использует функцию для кэширования данных во время загрузки одной страницы. На самом деле его можно использовать так же, как:
static $initialized = false;
Только благодаря центральному хранилищу и ведению записи переменных по имени функции другие функции могут получить доступ (и, что еще более важно для Drupal, сброс) к значению во время запроса страницы.
Как Drupal использует это:
Джефф Итон создал хороший пост в блоге около drupal_static и другие методы кеширования в Drupal 7.
Скажем, другой модуль хочет вызвать вашу функцию, так как вы установили $initialized
к истине вы знаете, что вы можете получить данные из кэша. Но что, если этот другой модуль не хочет, чтобы вы его кэшировали? Затем он может сбросить вашу статическую переменную следующим образом:
$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