Closure
В отличие от других языков, где замыкания создаются автоматически, в PHP вы должны указать переменную, которая будет сохранена и доступна анонимной функции с помощью конструкции use.
Например, если вы попробуете:
function MyFunction() { echo("My Function"); $mylocalvar = "testing"; $MyInnerFunction = function() { echo($mylocalvar); }; $MyInnerFunction(); } MyFunction();
Вы обнаружите, что $MyInnerFunction не имеет доступа к $mylocalvar. Даже анонимная функция не имеет доступа к локальным переменным функции, которая ее содержит.
Однако вы можете предоставить ему доступ к любым переменным в содержащей функции, используя конструкцию use:
function MyFunction() { echo("My Function"); $mylocalvar = "testing"; $MyInnerFunction = function() use($mylocalvar) { echo($mylocalvar); }; $MyInnerFunction(); }
Теперь, когда вы запустите программу, вы увидите, что внутренняя функция имеет доступ к $mylocalvar. Это выглядит как дополнительный параметр, участвующий в вызове функции, и это действительно так.
Обратите внимание, что анонимные функции позволяют вам делать такие вещи, как передавать функцию в качестве параметра и возвращать функцию в результате.
Например:
function MyFunction() { echo("My Function"); $mylocalvar="testing"; $MyInnerFunction = function() use( $mylocalvar ) { echo($mylocalvar); }; return $MyInnerFunction; } $MyInnerFuncton=MyFunction(); $MyInnerFuncton();
Обратите внимание, что теперь внутренняя функция возвращается как результат MyFunction. Вы можете вызвать MyFunction и сохранить ссылку на внутреннюю функцию в переменной. Затем вы можете вызвать внутреннюю функцию, даже если внешняя функция завершена, и ни одна из ее локальных переменных больше не существует. Внутренняя функция по-прежнему имеет доступ к переменным, перечисленным в конструкции use.
Здесь нужно рассмотреть два момента.
Во-первых, замыкания на языке сервера не так полезны, как на языке клиента. Причина в том, что замыкания полезны в обратных вызовах и обработке событий, а серверная часть PHP использует гораздо меньше обоих.
Вторая проблема заключается в том, что $this по-прежнему не обрабатывается внутренней функцией должным образом. То есть вам все еще нужно использовать трюк $that, и вы по-прежнему не можете получить доступ к закрытым и защищенным элементам.
Однако анонимные функции позволяют вам делать много вещей, которые были бы трудны без них, и о них стоит знать.
Возможно, вы не обнаружите, что внутренние функции или анонимные функции - это то, что вы хотите использовать, но все, что вам нужно знать, - это возможность использовать фреймворк, когда вы можете писать какие-то модули, которые импортируются в другие функции или классы, и вы можете обнаружить, что любые функции, которые вы пишете, являются внутренними функциями просто в результате того, как фреймворк использует их.
Внутренние функции и замыкания Closure в PHP ч.1
Переведено с ресурса: i-programmer.info/programming/php/1130-php-inner-functions-and-closure.html