Как стать автором
Обновить

Комментарии 40

Стоит отметить, что в PHP 5.4 также стал доступен контекст $this в анонимной функции.
А еще трейты. На них тоже кеширование реализуется в полпинка.
Пример можно?
Да! Жалко только, что сразу не сделали в 5.3
в 5.3 можно использовать трюк
$_this = $this;
function() use($_this) {
     // например echo $_this->nickname; 
};

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


Кстати, да. Но, может быть, Вы тогда поделитесь своим опытом в этом отношении?
НЛО прилетело и опубликовало эту надпись здесь
>2. Далее. У автора описан класс Cache…
в этом классе пример представлен как псевдокод, код связанный с реализацией конкретного кеша пропущен
>6. Автору нужно отправиться в школу, обычную школу…
а он собрался на ZCE
>1. Ну во-первых, после фигурной скобки завершающей тело анонимной функции хорошо бы поставить точку с запятой.
Пропустил, исправил

Про методы без тела уже сказали выше, и это исправлено.

Методы у класса Cache естественно public — я же могу обращаться к нему и напрямую без обертки. Обертка это скорее сахар, и хороший пример передачи кода через замыкания (на мой взгляд).

>6. Автору нужно отправиться в школу, обычную школу.
Зачем грубишь? Статья первая, если критика по существу — то только на пользу.
И не лень же было столько понавыписывать…
Самое удивительное то, что в подобной статье самое большое негодование вызвало оформление(!) примера. По моему, любому мало-мальски знакомому с php программисту понятно, что автор хотел сказать в примере и что «лишнее» вырезано для краткости. Пример здесь служит для демонстрации логики, а не реализации. Ну, конечно, если до каждой точки с запятой докапываться, то вам надо энциклопедии читать, а не статьи в инете. К слову сказать вы тоже пунктуацией не блещете.

Критика по существу: смысл всей статьи сводится к 1 предложению — «Используя замыкания можно передавать в метод (функцию) или возвращать из него, фрагмент готового к исполнению кода, с локальными переменными из того окружения где этот код объявлен», что можно было продемонстрировать гораздо проще (например, как в документации).
если уж кэшируются результаты запросов в базу — то и ключ можно было бы построить иначе. и таким образом получить код, который не требует прерываний и выполняется только если это на самом деле нужно.
хотя возможно в статье просто слишком обобщённый пример
все хорошо, но так и не понял двух моментов:
зачем использовать замыкания для кеша и зачем в кеше использовать какой-то счетчик?
счетчик был введён намерено, для демонстрации импорта переменной в замыкание по ссылке, если эту переменная должна быть изменена.
По-моему кэш все-таки прослойкой должен быть, а не кусками кода понапиханными во все модели (и не важно как эти куски кода реализованны, замыкания, трейты или еще что).
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории