Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
2 / 2 / 1
Регистрация: 24.01.2013
Сообщений: 80

Анонимная функция и замыкание

28.07.2015, 18:21. Показов 4472. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем. Поясните пожалуйста верно ли я понял.
Вот есть анонимная функция(онаже Лямбда-функци) с помощью которой делаем замыкание (closures)
PHP
1
2
3
$logdb = function ($string) { Logger::log('debug','database',$string); };
$logdb('Connected to database'); 
$logdb('Insert Hammer into to parts table');
Или я где-то не верен в определениях?

Добавлено через 2 часа 44 минуты
бамп

Добавлено через 15 секунд
бамп

Добавлено через 3 часа 32 минуты
бамп
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.07.2015, 18:21
Ответы с готовыми решениями:

Не срабатывает анонимная функция
Добрый день! Подскажите, пожалуйста, почему текст 'connect' в данном случае виден, а 'inner connect' нет? public function...

Анонимная функция
Небольшой код с анонимной функцией. Скажите каким образом при выводе сообщения через alert к Hello добавляется Mike? var myAlert =...

Анонимная функция в интегрировании
Здравствуйте, гуглил способы интегрирования в Matlab и наткнулся на функцию для числового интегрирования quadl. Для примера представлен...

11
5 / 4 / 4
Регистрация: 27.07.2015
Сообщений: 48
28.07.2015, 19:36
Читай мануал
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
28.07.2015, 20:21
В этом мануале пишут что анонимные функции это и есть замыкания... Почему то я думал иначе.

Цитата Сообщение от utopia Посмотреть сообщение
Или я где-то не верен в определениях?
Я бы назвал это просто анонимной функцией с 1 аргументом. Замыкание мне кажется больше похоже на
PHP
1
2
3
4
5
6
7
$string = "asdf";
$logdb = function () use ($string)
    {
        Logger::log('debug','database',$string);
    };
$logdb('Connected to database'); 
$logdb('Insert Hammer into to parts table');
Но после прочтенного на официальном сайте PHP об анонимных функциях, я уже сомневаюсь...

Вот так можно посмотреть разницу
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<pre>
<?php
// без замыкания
$a = 1;
$b = function (&$a)
    {
        echo $a++.PHP_EOL;
    };
// каждый раз при вызове функции приходится
// передавать $a в качестве аргумента
$b($a);
$b($a);
$b($a);
 
echo PHP_EOL;
 
// с замыканием
$a = 1;
$b = function () use(&$a)
    {
        echo $a++.PHP_EOL;
    };
// передали ссылку на переменную в функцию
// больше эту переменную передавать в качестве аргумента не надо
$b();
$b();
$b();
результат одинаковый:
Code
1
2
3
4
5
6
7
1
2
3
 
1
2
3
0
2 / 2 / 1
Регистрация: 24.01.2013
Сообщений: 80
28.07.2015, 20:58  [ТС]
Издержек перевода очень много. Я уже задолбался читать в каждой книге кто на что гаразд, каждый переводит как хочет и в одной книге только можно встретить что-то типа разных названий одного и того же.
Пример1: Объект = Экземпляр класса = Экземпляр.
Пример2: Реализация = Имплементация = Расширение.
И сиди и думай что имел в виду автор.

Вот в книге :
PHP. Объекты, шаблоны и методики программирования, 3-е издание 2011 Автора Мэтт Зандстра пишется что замыкание это всё же механизм. Но если это механизм, то в чём он заключается.

Сначала думал что дело в use, но это всего лишь что-то типа использования более полных возможностей анонимной функции. Но если Анонимная функция = Замыкание почему во многих книгах в оглавлении это обозначается через "и" как разные, но связанные вещи. А тут ещё и офф документация непонятно вводит в заблуждение или правду говорит.

Надеялся тут пояснят
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
28.07.2015, 21:07
Лучший ответ Сообщение было отмечено utopia как решение

Решение

Цитата Сообщение от utopia Посмотреть сообщение
Сначала думал что дело в use, но это всего лишь что-то типа использования более полных возможностей анонимной функции.
Из википедии
Замыкание (англ. closure) в программировании — функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции в окружающем коде и не являющиеся её параметрами. Говоря другим языком, замыкание — функция, которая ссылается на свободные переменные в своём контексте.
По-моему use как раз это и выполняет...

Добавлено через 6 минут
Цитата Сообщение от utopia Посмотреть сообщение
Пример1: Объект = Экземпляр класса = Экземпляр.
Пример2: Реализация = Имплементация = Расширение.
Ну разница между объектом и экземпляром класса, и реализацией и имплементацией просто семантическая.

Например в html есть тег <b> и <strong>. Теги предназначены для разного, но до наших глаз доходит результат один и тот же совершенно
1
2 / 2 / 1
Регистрация: 24.01.2013
Сообщений: 80
28.07.2015, 21:37  [ТС]
pav1uxa, вот, теперь я смогу спать со спокойной душой)
Всем спасибо.
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
29.07.2015, 00:55
utopia, в php замыкание это стремление к моде и не больше, есть же static
PHP
1
2
3
4
5
6
7
8
function test()
{
    static $a = 1;
    return $a++;
}
 
echo test(), PHP_EOL;
echo test();
1
2 / 2 / 1
Регистрация: 24.01.2013
Сообщений: 80
29.07.2015, 11:42  [ТС]
Poznakomlus, но тут мы задаём значение переменной в самой функции, а не передаём ей какое-либо/

А вобще на счёт моды возможно вы правы, зачем use:
PHP
1
2
3
4
5
6
7
8
$a = 1;
$b = function () use(&$a)
{
    echo $a++.PHP_EOL;
};
$b();
$b();
$b();
1 2 3
когда можно:
PHP
1
2
3
4
5
6
7
8
$a = 1;
$b = function (&$a)
{
    echo $a++.PHP_EOL;
};
$b($a);
$b($a);
$b($a);
1 2 3
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
29.07.2015, 22:51
Цитата Сообщение от utopia Посмотреть сообщение
зачем use
Представим что нам нужно передать callback стандартной функции. Она на вход подаст те аргументы которые умеет. А откуда нам взять дополнительные данные которые нам нужны? Вот там-то use и пригодиться

Пример на вскидку

PHP
1
2
3
4
5
$arExclude = array(1, 3, 5);
 
$arOutput = array_filter($arInput, function ($value) use($arExclude) {
   return $value > 10 && ! in_array($value, $arExclude);
});
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
29.07.2015, 23:05
insideone, здесь то нет никакого замыкания
в array_filter вы передаете неименованную функцию и да с помощью use параметры
когда-то тоже любил писать подобно
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function getValute($name)
{
    return function ($name) use (&$xml) {
        if (!isset($xml)) {
            $file = 'http://pfsoft.com.ua/service/currency/?date=' . date('dmY');
            $xml = simplexml_load_file($file);
        }
        $valute = $xml->xpath("/ValCurs/Valute[CharCode='$name']")[0];
        return $valute->Nominal . ' ' . $valute->Name . ' - ' . $valute->Value;
    };
}
 
$valute = getValute($name);
echo $valute('USD'), '<br>', $valute('EUR');
но ведь можно проще
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
30.07.2015, 00:47
Как это нет? Уже определяли что такое замыкание:

Цитата Сообщение от pav1uxa Посмотреть сообщение
Замыкание (англ. closure) в программировании — функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции в окружающем коде и не являющиеся её параметрами
В моем примере есть анонимная функция в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не являющиеся её параметрами. А именно $arExclude
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
30.07.2015, 01:31
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function diffTime()
{
    return function()use(&$time){
        if(isset($time)){
            echo (microtime(true)- $time), PHP_EOL;
            $time = null;
        }else{
            $time = microtime(true);
        }
    };
}
$test = diffTime();
$test();
sleep(1);
$test();
$test();
sleep(2);
$test();
а здесь переменная $time нигде не объявлена и сохраняется в замыкании
привел более наглядный пример
И еще маленький примерчик
PHP
1
2
3
4
5
6
7
8
9
function sum()
{
    return function ($a) {
        echo $a + 1;
    };
}
 
$test = sum();
$test(1);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.07.2015, 01:31
Помогаю со студенческими работами здесь

Анонимная самовызывающаяся функция
Почему анонимную функцию нельзя вызвать без круглых скобок? Нет ошибок: (function(){ //do something })(); Ошибка: ...

Анонимная функция, вернуть 2 параметра
Доброго времени! Подскажите, конструкцию как можно используя анонимную функцию @() или inline вернуть 2 и более параметров?

Анонимная функция нахождения произвидения 2 чисел
Задание: Анонимная функция нахождения произвидения 2 чисел. Пытался сделать самостоятельно нечего адекватного не вышло...

Что такое Анонимная Функция, где используется?
Здравствуйте. Расскажите, пожалуйста, что такое анонимная функция, для чего она нужна, и как она используется на практике. А так же,...

Анонимная кнопка
Казалось бы простой вопрос, но поковырявшись в методах и погуглив ответа не нашел. Если я создаю анонимную кнопку как привязать к ней...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru