Комментарии 40
Стоит отметить, что в PHP 5.4 также стал доступен контекст $this в анонимной функции.
А еще трейты. На них тоже кеширование реализуется в полпинка.
Да! Жалко только, что сразу не сделали в 5.3
в 5.3 можно использовать трюк
но конечно private и protected члены будут недоступны в замыкании
$_this = $this;
function() use($_this) {
// например echo $_this->nickname;
};
но конечно private и protected члены будут недоступны в замыкании
А плюс то в чем? Вы велосипед изобрели. Паттерну отложенной загрузги уже сто лет в обед.
Паттерн известный, но когда нужно было решить похожую задачу в 4 PHP — красивого решения я не нашёл (если такое есть, буду очень рад его посмотреть). А цель поста была указать на непривычное применение замыканий, для гуру здесь конечно откровений никаких нет, но для кого-то я думаю этот пост будет полезен. Может кто-то увидит решение своей проблемы, связанной с отложенным выполнением кода, и выложит здесь.
Спасибо огоромное за статью. Только один нюанс. Не учите людей плохому. Уберите статики. Иначе Ваши классы превращаются в набор функций. Еще раз спасибо.
Ой. А в PHP нельзя сделать как-то так?
@ lru_cache #пробела после собаки тут на самом деле нет
def get(date):
return query(blablabla(date))
Вполне нормально смотрится и так, или я чего-то не понимаю
<?php
$dateCreated = date('Y-m-d');
$data = $cache->load($dateCreated);
if (!$data) {
$data = PostModel::getList($dateCreated);
$cache->set($dateCreated, $data);
}
Объясните, почему в первом листинге все методы объявлены без method body? Это же не абстрактные методы и классы.
спокойнее
Прочь эмоциональную критику, даёшь конструктивные замечания!
Полностью согласен с Вашими замечаниями.
Пользуюсь (и вроде как успешно) замыканиями в пхп уже как пару лет, но суть данной статьи не понял вообще. Совсем не понял.
Кстати, да. Но, может быть, Вы тогда поделитесь своим опытом в этом отношении?
>2. Далее. У автора описан класс Cache…
в этом классе пример представлен как псевдокод, код связанный с реализацией конкретного кеша пропущен
>6. Автору нужно отправиться в школу, обычную школу…
а он собрался на ZCE
в этом классе пример представлен как псевдокод, код связанный с реализацией конкретного кеша пропущен
>6. Автору нужно отправиться в школу, обычную школу…
а он собрался на ZCE
>1. Ну во-первых, после фигурной скобки завершающей тело анонимной функции хорошо бы поставить точку с запятой.
Пропустил, исправил
Про методы без тела уже сказали выше, и это исправлено.
Методы у класса Cache естественно public — я же могу обращаться к нему и напрямую без обертки. Обертка это скорее сахар, и хороший пример передачи кода через замыкания (на мой взгляд).
>6. Автору нужно отправиться в школу, обычную школу.
Зачем грубишь? Статья первая, если критика по существу — то только на пользу.
Пропустил, исправил
Про методы без тела уже сказали выше, и это исправлено.
Методы у класса Cache естественно public — я же могу обращаться к нему и напрямую без обертки. Обертка это скорее сахар, и хороший пример передачи кода через замыкания (на мой взгляд).
>6. Автору нужно отправиться в школу, обычную школу.
Зачем грубишь? Статья первая, если критика по существу — то только на пользу.
И не лень же было столько понавыписывать…
Самое удивительное то, что в подобной статье самое большое негодование вызвало оформление(!) примера. По моему, любому мало-мальски знакомому с php программисту понятно, что автор хотел сказать в примере и что «лишнее» вырезано для краткости. Пример здесь служит для демонстрации логики, а не реализации. Ну, конечно, если до каждой точки с запятой докапываться, то вам надо энциклопедии читать, а не статьи в инете. К слову сказать вы тоже пунктуацией не блещете.
Критика по существу: смысл всей статьи сводится к 1 предложению — «Используя замыкания можно передавать в метод (функцию) или возвращать из него, фрагмент готового к исполнению кода, с локальными переменными из того окружения где этот код объявлен», что можно было продемонстрировать гораздо проще (например, как в документации).
Самое удивительное то, что в подобной статье самое большое негодование вызвало оформление(!) примера. По моему, любому мало-мальски знакомому с php программисту понятно, что автор хотел сказать в примере и что «лишнее» вырезано для краткости. Пример здесь служит для демонстрации логики, а не реализации. Ну, конечно, если до каждой точки с запятой докапываться, то вам надо энциклопедии читать, а не статьи в инете. К слову сказать вы тоже пунктуацией не блещете.
Критика по существу: смысл всей статьи сводится к 1 предложению — «Используя замыкания можно передавать в метод (функцию) или возвращать из него, фрагмент готового к исполнению кода, с локальными переменными из того окружения где этот код объявлен», что можно было продемонстрировать гораздо проще (например, как в документации).
если уж кэшируются результаты запросов в базу — то и ключ можно было бы построить иначе. и таким образом получить код, который не требует прерываний и выполняется только если это на самом деле нужно.
хотя возможно в статье просто слишком обобщённый пример
хотя возможно в статье просто слишком обобщённый пример
все хорошо, но так и не понял двух моментов:
зачем использовать замыкания для кеша и зачем в кеше использовать какой-то счетчик?
зачем использовать замыкания для кеша и зачем в кеше использовать какой-то счетчик?
По-моему кэш все-таки прослойкой должен быть, а не кусками кода понапиханными во все модели (и не важно как эти куски кода реализованны, замыкания, трейты или еще что).
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Наглядный пример использования замыканий в PHP