Внутренние функции и замыкания Closure в PHP ч. 3

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

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