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

Timeweb Many GEOs


Вы можете поделиться этой статьей в любой из соцсетей, представленных ниже:


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