Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: как понять замыкание
Форумы портала PHP.SU » » Вопросы новичков » как понять замыкание

Страниц (1): [1]
 

1. Perun - 24 Августа, 2020 - 14:37:57 - перейти к сообщению
Встречая в коде различные вариации замыканий я еще понимаю как работает, но сам вряд ли бы где использовал. Проблема в понимании начинается, когда используется передача параметров/замыкания используются чтобы передать их в качестве параметров другой функции.
Может кто подскажет как легче усвоить какой что ли ход мыслей при использовании замыканий..? Когда вот прям без замыканий никак
Документацию, кучу ссылок с примерами(многие из которых просто копирка с документации) в сети читал, пока не полегчало. Почти во всех примерах есть общее пояснение работы, но мало о том почему использовано именно замыкание, почему оно так необходимо в том или ином случае.
2. Строитель - 24 Августа, 2020 - 15:25:44 - перейти к сообщению
Perun пишет:
мало о том почему использовано именно замыкание, почему оно так необходимо в том или ином случае.
Вероятно, чтобы было меньше коллизий с глобальными пользовательскими функциями. Например можно так
Спойлер (Отобразить)
Но можно и так
Спойлер (Отобразить)
Но если в коде ранее уже была объявлена функция callback, то код завершится ошибкой.
3. LIME - 24 Августа, 2020 - 15:30:01 - перейти к сообщению
Замыкание это другой способ создания "объекта".
Что есть объект? Данные и методы работы с ними. Инкапсуляция всего набора в один ... объект)).
Замыкание(возвращаемый метод/ф-ция) так же может хранить ссылку на данные "инкапсулированные" в нем самом. Более никто к этим данным не имеет доступа(по хорошему). Замыкания это объекты функционального программирования))
Perun пишет:
Когда вот прям без замыканий никак
если можно без них, то делай без них и не парься. Сам долгое время косился на этого зверька с непониманием и недоверием) Забей короче.
4. Строитель - 24 Августа, 2020 - 15:32:07 - перейти к сообщению
LIME пишет:
Замыкания это объекты функционального программирования))
Вот это - отличное определение замыканиям Улыбка
5. Perun - 24 Августа, 2020 - 18:01:52 - перейти к сообщению
Строитель пишет:
Вероятно, чтобы было меньше коллизий с глобальными пользовательскими функциями.

С простыми реализациями понятно как работает. И это, я так понимаю - побочный эффект а не основное применение замыканий. Как вариант Улыбка

Встретил вот такой пример в сети без замыкания :
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. Class Cache
  3. {
  4.     static function set( $key, $value) {
  5.        //  код записи в кеш
  6.     }
  7.     static function get( $key ) {
  8.        // код чтения из кеша
  9.     }
  10. }
  11.  
  12. Class PostModel
  13. {
  14.     static function getList($dateCreated) {
  15.        // код получения постов с указанной даты
  16.     }
  17. }
  18.  
  19. $dateCreated = date('Y-m-d');
  20. $posts = Cache::get("posts_" . $dateCreated);
  21.  
  22. if( !$posts ) {
  23.    $posts = PostModel::getList($dateCreated);
  24.    Cache::set( "posts_" . $dateCreated , $posts);
  25. }
  26. ?>


И "тот же", но уже с замыканием:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $dateCreated = date('Y-m-d');
  3. $dbQueryCounter = 0;
  4. $fallback = function() use($dateCreated, &$dbQueryCounter) {
  5.    $dbQueryCounter++;   //счетчик импортирован в замыкание по ссылке
  6.    return PostModel::getList($dateCreated); // не забываем return
  7. };
  8. Cache::wrapper( "posts_" . $dateCreated , $fallback );
  9.  
  10. Class Cache
  11. {
  12.     static function set( $key, $value) {
  13.        //  код записи в кеш
  14.     }
  15.     static function get( $key ) {
  16.        // код чтения из кеша
  17.     }
  18.     static function wrapper( $key, Closure $fallback ) {
  19.         $data = self::get( $key );
  20.         if( !$data ) {
  21.             $data = $fallback(); // отложенное выполнение кода
  22.             self::set( $key, $data);
  23.         }
  24.         return $data;
  25.     }
  26. }
  27. ?>

Но я что-то не особо вижу "улучшения". Вернее, я не понимаю что стало лучше с использованием замыкания. Кроме того, стало больше кода, отсутствует один класс, и непонятно зачем появился счетчик.
Почитаю еще раз доку, и наверное таки отложу до лучших времен...
6. LIME - 24 Августа, 2020 - 20:32:12 - перейти к сообщению
оба варианта чушь
все на статике....брррр
7. LIME - 25 Августа, 2020 - 18:24:42 - перейти к сообщению
Perun в пыхе(в нормальном ооп вообще) польза замыканий сомнительна
попробуй написать js с приватными свойствами и там будет понятнее
(Добавление)
еще можно сказать - для хранения состояния между вызовами
что вообще считается злом ибо не чистая ф-ция, но для моделей(entity) то что надо
8. LIME - 27 Сентября, 2020 - 19:11:57 - перейти к сообщению
http://forum.php.su/topic.php?fo...41478#1601041478
вот примерчик образовался когда без замыкания всё немножко не то
считай замыкаем переменную во внешнем(родительском) скопе, но не глобальном
это не глобальная, но и не локальная переменная
как-то так

 

Powered by ExBB FM 1.0 RC1