- PVSM.RU - https://www.pvsm.ru -
Начиная с версии 5.3, PHP позволяет создавать замыкания. К сожалению, пример их использования в официальной документации http://www.php.net/manual/en/functions.anonymous.php [1] (example 3) обладает редкой изощрённостью и надуманностью. Надеюсь, пример под катом поможет увидеть в замыканиях другое применение, кроме как с функциями типа array_map().
Самый распространённый метод повышения производительности приложения – это кэширование, и обычно схема его применения выглядит так:
<?php
Class Cache
{
static function set( $key, $value);
static function get( $key );
}
Class PostModel
{
static function getList($dateCreated);
}
$dateCreated = date('Y-m-d');
$posts = Cache::get("posts_" . $dateCreated);
if( !$posts ) {
$posts = PostModel::getList($dateCreated);
Cache::set( "posts_" . $dateCreated , $posts);
}
?>
Пытаемся получить данные из кеша, если данные не найдены — делаем запрос к БД и пишем результат в кеш. Логика каждый раз почти одинаковая и хотелось бы написать универсальную обёртку для таких случаев, но как передавать в неё не просто переменную, а кусок кода, который должен выполняться уже внутри обёртки, т.е. отложено?
И тут на помощь приходят замыкания, чтобы передать в функцию (или метод) кусок кода для отложенного выполнения его нужно обернуть анонимной функцией.
<?php
$dateCreated = date('Y-m-d');
$dbQueryCounter = 0;
$fallback = function() use($dateCreated, &$dbQueryCounter) {
$dbQueryCounter++; //счетчик импортирован в замыкание по ссылке
return PostModel::getList($dateCreated);
}
Cache::wrapper( "posts_" . $dateCreated , $fallback );
Class Cache
{
static function set( $key, $value);
static function get( $key );
static function wrapper( $key, Closure $fallback ) {
$data = self::get( $key );
if( !$data ) {
$data = $fallback(); // отложенное выполнение кода
self::set( $key, $data);
}
return $data;
}
}
?>
На что в этом коде нужно обратить внимание:
Автор: bardex
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/php-2/9033
Ссылки в тексте:
[1] http://www.php.net/manual/en/functions.anonymous.php: http://www.php.net/manual/en/functions.anonymous.php
Нажмите здесь для печати.