Замыкания в 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? Основным назначением замыканий является замена глобальных переменных. И такие переменные можно передавать внутрь функций по значению, но изменять значения таких переменных (переданных через механизм замыкания) нельзя. И немаловажное преимущество такого: изменение значения такой глобальной переменной никоим образом не отразиться на работе анонимной функции, в которую через замыкание передана эта глобальная переменная.