Замыкания в PHP
Для начала разберемся с тем, а что же такое замыкание. Замыкание - это некоторая функция, которая запоминает состояние программного окружения на момент исполнения скрипта. В случае, если состояние было изменено, функцией-замыканием запоминается именно первоначальное состояние.
Конкретно в PHP замыкания применяются только к анонимным функциями, и срабатывает только после его активизации. Соответственно, чтобы активировать замыкание в PHP, необходимо указать ключевое слово use
после перечисления аргументов функции (т.е. после закрывающей круглой скобки с аргументами функции). После указания ключевого слова в круглых скобках указываем те переменные, которые должны попасть в замыкание.
Рассмотрим использование замыкания на небольшом примере:
<?php $message = 'Возникли следующие ошибки при заполнении формы:<br>'; $check = function (array $errors) use ($message) { $strErrors = ''; if (!empty($errors)) { $strErrors = implode('<br>', $errors); } return $message . $strErrors; }; //--------- $errors[] = 'Необходимо заполнить все поля'; $errors[] = 'Неверно указан Email'; echo $check($errors); echo '<br>------------<br>'; $message = 'Переопределили значение переменной'; echo $check($errors);
В результате выполнения данного скрипта получаем следующее:
Возникли следующие ошибки при заполнении формы: Необходимо заполнить все поля Неверно указан Email ------------ Возникли следующие ошибки при заполнении формы: Необходимо заполнить все поля Неверно указан Email
По данному примеру видим,что, переопределив значение переменной $message
, после вызова анонимной функции получили все равно старое значение $message
. То есть, функция замыкания запомнила первоначальное состояние необходимых переменных, переданных в анонимную функцию через use
(то есть анонимная функция, помещенная в $check
, захватила значение переменной $message
).
Можно подвести итог. Так для чего же использовать функции замыкания в PHP? Основным назначением замыканий является замена глобальных переменных. И такие переменные можно передавать внутрь функций по значению, но изменять значения таких переменных (переданных через механизм замыкания) нельзя. И немаловажное преимущество такого: изменение значения такой глобальной переменной никоим образом не отразиться на работе анонимной функции, в которую через замыкание передана эта глобальная переменная.