Pull to refresh

Comments 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.
UFO landed and left these words here
Прочь эмоциональную критику, даёшь конструктивные замечания!
UFO landed and left these words here
Полностью согласен с Вашими замечаниями.
Пользуюсь (и вроде как успешно) замыканиями в пхп уже как пару лет, но суть данной статьи не понял вообще. Совсем не понял.


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

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

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

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

Критика по существу: смысл всей статьи сводится к 1 предложению — «Используя замыкания можно передавать в метод (функцию) или возвращать из него, фрагмент готового к исполнению кода, с локальными переменными из того окружения где этот код объявлен», что можно было продемонстрировать гораздо проще (например, как в документации).
если уж кэшируются результаты запросов в базу — то и ключ можно было бы построить иначе. и таким образом получить код, который не требует прерываний и выполняется только если это на самом деле нужно.
хотя возможно в статье просто слишком обобщённый пример
все хорошо, но так и не понял двух моментов:
зачем использовать замыкания для кеша и зачем в кеше использовать какой-то счетчик?
счетчик был введён намерено, для демонстрации импорта переменной в замыкание по ссылке, если эту переменная должна быть изменена.
По-моему кэш все-таки прослойкой должен быть, а не кусками кода понапиханными во все модели (и не важно как эти куски кода реализованны, замыкания, трейты или еще что).
Only those users with full accounts are able to leave comments. Log in, please.