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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: как понять замыкание

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Perun
Отправлено: 24 Августа, 2020 - 14:37:57
Post Id


Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Дек. 2016  


Помог: 0 раз(а)




Встречая в коде различные вариации замыканий я еще понимаю как работает, но сам вряд ли бы где использовал. Проблема в понимании начинается, когда используется передача параметров/замыкания используются чтобы передать их в качестве параметров другой функции.
Может кто подскажет как легче усвоить какой что ли ход мыслей при использовании замыканий..? Когда вот прям без замыканий никак
Документацию, кучу ссылок с примерами(многие из которых просто копирка с документации) в сети читал, пока не полегчало. Почти во всех примерах есть общее пояснение работы, но мало о том почему использовано именно замыкание, почему оно так необходимо в том или ином случае.

(Отредактировано автором: 24 Августа, 2020 - 14:48:11)

 
 Top
Строитель Модератор
Отправлено: 24 Августа, 2020 - 15:25:44
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Perun пишет:
мало о том почему использовано именно замыкание, почему оно так необходимо в том или ином случае.
Вероятно, чтобы было меньше коллизий с глобальными пользовательскими функциями. Например можно так
Спойлер (Отобразить)
Но можно и так
Спойлер (Отобразить)
Но если в коде ранее уже была объявлена функция callback, то код завершится ошибкой.
 
 Top
LIME
Отправлено: 24 Августа, 2020 - 15:30:01
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Замыкание это другой способ создания "объекта".
Что есть объект? Данные и методы работы с ними. Инкапсуляция всего набора в один ... объект)).
Замыкание(возвращаемый метод/ф-ция) так же может хранить ссылку на данные "инкапсулированные" в нем самом. Более никто к этим данным не имеет доступа(по хорошему). Замыкания это объекты функционального программирования))
Perun пишет:
Когда вот прям без замыканий никак
если можно без них, то делай без них и не парься. Сам долгое время косился на этого зверька с непониманием и недоверием) Забей короче.
 
 Top
Строитель Модератор
Отправлено: 24 Августа, 2020 - 15:32:07
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




LIME пишет:
Замыкания это объекты функционального программирования))
Вот это - отличное определение замыканиям Улыбка
 
 Top
Perun
Отправлено: 24 Августа, 2020 - 18:01:52
Post Id


Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Дек. 2016  


Помог: 0 раз(а)




Строитель пишет:
Вероятно, чтобы было меньше коллизий с глобальными пользовательскими функциями.

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

Встретил вот такой пример в сети без замыкания :
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. ?>

Но я что-то не особо вижу "улучшения". Вернее, я не понимаю что стало лучше с использованием замыкания. Кроме того, стало больше кода, отсутствует один класс, и непонятно зачем появился счетчик.
Почитаю еще раз доку, и наверное таки отложу до лучших времен...
 
 Top
LIME
Отправлено: 24 Августа, 2020 - 20:32:12
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




оба варианта чушь
все на статике....брррр
 
 Top
LIME
Отправлено: 25 Августа, 2020 - 18:24:42
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Perun в пыхе(в нормальном ооп вообще) польза замыканий сомнительна
попробуй написать js с приватными свойствами и там будет понятнее
(Добавление)
еще можно сказать - для хранения состояния между вызовами
что вообще считается злом ибо не чистая ф-ция, но для моделей(entity) то что надо
 
 Top
LIME
Отправлено: 27 Сентября, 2020 - 19:11:57
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




http://forum.php.su/topic.php?fo...41478#1601041478
вот примерчик образовался когда без замыкания всё немножко не то
считай замыкаем переменную во внешнем(родительском) скопе, но не глобальном
это не глобальная, но и не локальная переменная
как-то так
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB