что такое замыкание в php приведите пример

Замыкания в php

Не секрет, что в PHP 5.3 был введен ряд интересных новшеств. Разной степени полезности и скандальности. Возможно даже, что выпуск PHP 5.3 — хорошо спланированный PR-ход: самый большой список изменений за последние пять лет, оператор goto (sic!), пространства имен (namespaces) с синтаксисом «не как у всех», позднее статическое связывание (late static binding), более-менее честные анонимные (лямбда) функции (lambda functions), замыкания (closures).

О последних я и хочу рассказать. Справедливости ради хочу добавить, что в PHP 5.3 введено и много другого функционала, который делает этот релиз примечательным: модули Intl (интернационализация), Phar (PHP-архивы, наподобие JAR для JAVA), mysqlnd (новый драйвер для mysql), улучшения в SPL, общее увеличение производительности до 10% и много еще чего.

Замыкания (closures) и лямбда-функции (lambda functions) — нововведения PHP 5.3, вообще говоря, не являются передовым рубежом современных технологий. Удивительно, но и то и другое появилось в функциональном языке программирования LISP в конце 50-х, и было допилено напильником до состояния близкого к современному в 70-х годах. Таким образом, PHP подотстал с грамотной реализацией лет на 40.

Замыкания, если верить википедии — это процедуры, которые ссылаются на свободные переменные в своём лексическом контексте. Академически строго, но если бы я не знал о чем речь, никогда бы не понял из этого определения.

Во многих языках программирования, функция, чье определение вложено в другую функцию, так или иначе может иметь доступ не только к своим локальным переменным, но и к переменным родительской функции. Иногда для этого используется какой-то специальный синтаксис, иногда это работает без дополнительный усилий. Приведу пример на Javascript, потому что там все работает без какого-то особого синтаксиса (те же примеры, но на PHP будут позже):

Итак, функция inner, без какого-то специального объявления свободно использует переменные внешней функции outer. Но это еще не замыкание.

Во многих языках программирования функция (имеется в виду не результат выполнения функции, а сама функция как исполняемый код, указатель на функцию), это некий объект особого типа. Как любой другой объект (строка, число, массив), функция может быть присвоена переменной, передана в другую функцию в качестве параметра и возвращена как результат выполнения другой функции. С этим связана и еще одна важная вещь: Функции при ее определении, можно не присваивать имени, а присвоить эту функцию переменной и вызывать ее через эту переменную. Сама же функция не имеет собственного имени, и поэтому остается «анонимной«. Такие функции называют так же лямбда функциями.

Лямбда-функции (и замыкания, будучи ими) как бы откладывают выполнение некоторого кода на более поздний срок. Поэтому часто используются в разработке интерфейсов пользователя в качестве обработчиков событий, что и было показано выше.

Вернемся к PHP. В нем все не так красиво как в Javascript. Во-первых, для того чтобы функция могла использовать переменные родительской функции, надо это явно указать в ее определении (это следует из идеологии языка), во-вторых работает это только с анонимными функциями и работает это все только с PHP 5.3. Пример 1j в исполнении PHP будет выглядеть как-то так:

А наш пример 2j как то так:

Анонимные функции в PHP позволяют упростить и сделать нагляднее применение различных встроенных функций использующих callback, например:

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

Может показаться, что анонимные функции уже были в предыдущих версиях PHP. Разве create_function, это не оно — то самое? И да, и нет. create_function при каждом вызове создает новую настоящую именованную функцию в глобальном пространстве имен(sic!), но ее имя начинается с \0 (нулевого байта) и поэтому не может вступить в конфликт с обычными функциями. Но разве можно назвать такую функцию действительно анонимной? Кстати, create_function возвращает строку с именем этой «анонимной» функции. В остальном, использование действительно похоже на использование анонимных функций в PHP 5.3:

Зачем нужны замыкания в PHP я понимаю слабо. Для простого сохранения состояния функции между вызовами? Например так:

Но для этого существует static переменные. Их использование проще, удобнее и требует меньше кода:

Для сложного сохранения состояния между вызовами существует ООП. Кстати, анонимные функции в PHP 5.3 все же не совсем честные функции! На поверку эта функция оказывается… оказывается… Внимание, фокус:

Функция оказывается объектом класса Closure — и вот оно это ваше ООП. А чтобы объект всячески корчил из себя функцию, разработчики PHP придумали специальный «магический» метод __invoke():

Подводя итоги: Анонимные функции и замыкания — очень мощный инструмент. И как любой мощный инструмент, требуют очень аккуратного применения. Они могут существенно упростить код программы, сделать его красивее и повысить его читаемость, а могут ровно наоборот — сделать его абсолютно нечитаемым. Замыкания очень часто применяются в качестве функций обратного вызова при программировании графических интерфейсов. Очень удобно вешать их в качестве обработчиков нажатий на разные кнопочки. Но на PHP практически никто не делает программы с GUI (хотя умельцы существуют), и на это есть некоторые причины — PHP все же язык веб-сценариев, а не десктоп приложений. Поэтому анонимные функции хороши в preg_replace_callback, array_filter и тому подобных функциях, а замыкания следует оставить для Javascript, Python и других языков, где они реализованы действительно хорошо и где реально нужны для использования в GUI.

Источник

Замыкания на PHP

Сегодня про замыкания на PHP. Сразу оговорюсь, эта статья для тех, кто уже более-менее понимает принципы программирования и умеет писать на PHP. Остальным рекомендую хороший и доступный курс PHP для начинающих от курсов WebShake – здесь вам дадут все необходимые знания для разработки на PHP, которые позже можно будет смело расширять и совершенствовать.

Замыкание или анонимная функция в PHP – это грубо говоря функция без имени, которую можно поместить в переменную или передать в другую функцию в качестве параметра.

Рассмотрим обычную функцию:

Как видите, мы сразу задаём имя функции и в дальнейшем будет всегда его использовать для обращения к ней.

Но что, если нам не нужна дополнительная функция, и достаточно создать анонимную функцию без имени, которую мы передадим в другую функцию для обработки её переметра. Если вы знакомы с Python, там это называется ляббда функцией, и там с её помощью мапят массивы. В PHP это называется Closure, и хотя её запустили в версии 5.3, до сих пор нет единого стандарта как и когда её следует использовать.

Посмотрим на пример её использования, для того, чтобы быстро умножить все элементы массива в 10 раз (будем считать, что массив состоит из целочисленных элементов, то есть из int), и нам просто нужно каждый элемент умножить на 10. Можно сделать по-старинке – написать foreach, в котором каждый элемент умножить на 10.

Но можно, ведь, использовать замыкание на PHP, и функцию array_map (это встроенная функция для обхода всех элементов массива). Передадим в функцию array_map нашу анонимную функцию и в ней сразу домножимся. Выглядеть будет гораздо элегантнее.

В результате, мы увидим массив, в котором каждый элемент домножен на 10. Как видите, я передаю анонимную функцию прямо в другую функцию.

Кстати, внутри замыкания своя область видимости, и внешние переменные, даже если они доступны другим функциям, здесь не будут видны. Для того, чтобы использовать какую-то внешнюю переменную, которая не будет передаваться аргументом функции, есть директива use, в котором и должны быть указаны все переменные, которые нужно использовать помимо аргументов анонимной функции:

Источник

Лямбда-функции и замыкания

что такое замыкание в php приведите пример. Смотреть фото что такое замыкание в php приведите пример. Смотреть картинку что такое замыкание в php приведите пример. Картинка про что такое замыкание в php приведите пример. Фото что такое замыкание в php приведите примерКонечно многие из нас знакомы с этим понятием, однако данная статья рассчитана на новичков. В данном посте постараюсь рассмотреть данный феномен и привести примеры использования. Для начала необходимо понять что же такое лямбда-функция. Итак, лямбда-функция, часто ее называют анонимной, т. е. функция при определении которой не нужно указывать ее имя. Возвращаемое значение такой функцией присваивается переменной, через которую в последствие эту функцию можно вызывать.
До выхода PHP 5.3 определять лямбда-функции было возможно, но их нельзя было назвать полноценными. Сейчас я приведу пару примеров и продолжим рассматривать данные понятия.

Конечно динамическое создание функций не решает всех проблем, однако порой написание такой одноразовой функции может быть полезным. Можно расширить наш пример:

Понятие замыкания наверняка знакомо программистам на JavaScript, а так же программистам на многих других языках. Замыкание — это функция, охватывающая или замыкающая текущую область видимости. Что бы понять все это, рассмотрим пример:

Как вы уже могли заметить, функция не имеет имени и результат присваивается переменной. Лямбда-функция, созданная таким образом, возвращает значение в виде объекта типа closure.
В PHP 5.3 стало возможно вызывать объекты как если бы они были функциями. А именно магический метод __invoke() вызывается каждый раз, когда класс вызывается как функция.
Переменные недоступны внутри функции, если они не объявлены глобальными, так же переменные из дочернего контекста недоступны если только не используется зарезервированное слово use. Обычно в PHP переменные передаются в замыкание значением, это поведение можно изменить с помощью ампермсанда перед переменной в выражении use. Рассмотрим пример:

Этот пример уже можно использовать для достаточно гибкого прототипирования. Достаточно объявить методы для всех SQL-операций с объектом.
Автор не призывает всех придерживаться такой практики, равно как и не считает что так лучше, все вышеописанное лишь пример использования, причем возможно не самый техничный и интересный, и не более того.
UPD Говоря о том самом длинном регулярном выражении, я не стал подписывать его в комментариях и решил вынести сюда. Оно лишь ищет строки в одинарных и двойных кавычках, а так же имена таблиц и экранирует их.

Источник

Анонимные функции

Анонимные функции, также известные как замыкания (closures), позволяют создавать функции, не имеющие определенных имен. Они наиболее полезны в качестве значений callback-параметров, но также могут иметь и множество других применений.

Пример #1 Пример анонимной функции

Замыкания также могут быть использованы в качестве значений переменных; PHP автоматически преобразует такие выражения в экземпляры внутреннего класса Closure. Присвоение замыкания переменной использует тот же синтаксис, что и для любого другого присвоения, включая завершающую точку с запятой:

Пример #2 Пример присвоения анонимной функции переменной

Замыкания могут также наследовать переменные из родительской области видимости. Любая подобная переменная должна быть объявлена в конструкции use.

Пример #3 Наследование переменных из родительской области видимости

// Сбросим message
$message = ‘hello’ ;

Результатом выполнения данного примера будет что-то подобное:

Пример #4 Замыкания и область видимости

// Базовая корзина покупок, содержащая список добавленных
// продуктов и количество каждого продукта. Включает метод,
// вычисляющий общую цену элементов корзины с помощью
// callback-замыкания.
class Cart
<
const PRICE_BUTTER = 1.00 ;
const PRICE_MILK = 3.00 ;
const PRICE_EGGS = 6.95 ;

Источник

Короткие замыкания в PHP

или стрелочные функции

Короткие замыкания, также называемые стрелочными функциями, являются способом написания более коротких анонимных функций в PHP. Эта полезн

Вот как они выглядят:

Итак, что можно сказать про короткие замыкания.

Более строго типизированный способ написания приведенного выше примера может быть таким:

Стоит упомянуть еще пару вещей:

Если вы хотите вернуть значение по ссылке, следует использовать следующий синтаксис:

Короче говоря, короткие замыкания обеспечивают ту же функциональность, которую вы ожидаете от обычных замыканий, за исключением того, что в теле функции допускается только одно выражение.

Нет многострочности

Вы правильно прочитали: короткие замыкания могут иметь только одно выражение. Это означает, что они исключают в них несколько строк.

В конце концов, многострочные замыкания по определению уже более многословны; поэтому возможность пропустить два ключевых слова ( function и return) не будет иметь большого значения.

Согласны ли вы с этим мнением, зависит от вас. Хоть, конечно, я бы мог применить однострочные замыкания в некоторых моих проектах, но есть также много многострочных, где я лично пропущу короткий синтаксис в этих случаях.

Хотя есть надежда: в будущем в короткие замыкания будет добавлена возможность использовать несколько строк, но это будет уже другая история и RFC.

Значения из внешней области видимости

Еще одно существенное различие между короткими и обычными замыканиями заключается в том, что для коротких не требуется ключевое слово use для доступа к данным из внешней области видимости.

Возможные будущие фичи

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

Кстати, разработчики фреймворка Laravel быстро отреагировали на появление коротких замыканий в PHP 7.4 и сделали их будущую поддержку, пример:

что такое замыкание в php приведите пример. Смотреть фото что такое замыкание в php приведите пример. Смотреть картинку что такое замыкание в php приведите пример. Картинка про что такое замыкание в php приведите пример. Фото что такое замыкание в php приведите пример

Веб-разработчик со стажем программирования более 9 лет, всегда в процессе учебы и созидания.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *