drupal_static () использует переменную FUNCTION, что это значит?


21
function drupal_set_page_content($content = NULL) {
     $content_block = &drupal_static(__FUNCTION__, NULL);
     $main_content_display = &drupal_static('system_main_content_added', FALSE);

 if (!empty($content)) {
   $content_block = (is_array($content) ? $content : array('main' => array('#markup' => $content)));
 }
 else {
   $main_content_display = TRUE;
   return $content_block;
  }
}

Этот фрагмент вставлен из common.inc. Мы переходим __FUNCTION__к, drupal_static()но я не знаю, что означает эта переменная. Означает ли это кеш для самой внешней функции? Как это работает? Я не вижу никаких данных, обработанных внутри функции, до ее возвращения $content_block.

Ответы:


34

__FUNCTION__является одной из так называемых магических констант PHP.

Все, что он делает - возвращает строку с именем функции, в которой содержится константа.

Например:

function my_strangely_named_function() {
  print __FUNCTION__;
}

Выше будет напечатано «my_strangely_named_function».

Drupal использует эту константу со своим статическим кешем, чтобы каждый кеш можно было идентифицировать с помощью любой другой функции, и, как таковой, его можно идентифицировать.

Чтобы использовать сокращенную версию вашего кода:

function drupal_set_page_content($content = NULL) {
  $content_block = &drupal_static(__FUNCTION__, NULL);
}

Любая другая функция в жизненном цикле Drupal может вызывать:

drupal_static_reset('drupal_set_page_content');

И это очистит кэш для этой конкретной функции, так что в следующий раз, когда она будет вызвана, данные будут созданы как новые.

Это просто базовое использование статического шаблона кэша, вы можете найти больше информации и примеров на странице документации дляdrupal_static() себя.


Спасибо за ваш ответ, теперь я понимаю, что означает эта ФУНКЦИЯ, но более того, где эта переменная $ content_block впервые создана, как все, что я могу найти в этом коде, это то, что она извлекает данные из кеша, но где кеш создается в первое место, спасибо!
Drupal cai

1
Вы знакомы со статическими переменными в PHP в целом?
Клайв

1
к первому комментарию и добавляя ко второму, в ветви ИСТИНА ifоператора
создается

1
Что сказал @Jimajamma, плюс тот факт, что он drupal_staticхранит реестр кэшей для всех функций в системе, которые его используют.
Клайв

1
Это может быть демонстрацией моего незнания PHP, но - в любом случае: почему они говорят в entityreference:, drupal_staticа не &drupal_static?
Артур

3

Подробную информацию вы получите по адресу http://blogs.sourceallies.com/2012/02/static-caching-in-drupal/ . Вот цитата из этого:

... кэширование (любого типа, а не только статическое кэширование) должно выполняться ответственным образом. Чрезмерное использование кэширования затопляет память, которая может привести к краху сайтов с высоким трафиком. Помните также, что кеширование должно использоваться для больших структур данных, которые дорого генерировать. Наконец, используйте кеширование, только если вы точно знаете, что то, что вы кешируете, понадобится снова (например, данные меню в Drupal). Нет смысла кэшировать список имен, адресов или цветов, если этот список больше никогда не будет использоваться. Это было бы похоже на сохранение старых автомобильных шин после того, как вы надели новые.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.