К примеру, мы имеем глобальную переменную, эта переменная доступна из любого участка кода. Соответственно эта переменная может меняться в процессе выполнения скрипта. НО!!! в каком-то участке кода, нам нужно что бы эта переменная была неизменна-статична (запомнила свое состояние). В этом заключается механизм замыкания.
Стоит еще обратить внимание, что замыкания применяются только к анонимным функциям (безымянным функциям). Для инициализации замыкания, используется ключевое слово «use«, и то что будет указано после слова «use«, будет передано в замыкание (т.е. останется неизменным).
Это проще понять на примере:
<?php
$send = '<p>Report: Houston we have a problem:</p>';
$circuitFunction = function (array $errors) use ($send) {
$strErrors = '';
if (!empty($errors)) {
$strErrors = implode(' ', $errors);
}
return $send . $strErrors;
};
$errors[] = '<p>Errors: Containers with oxygen were exploded</p>';
$errors[] = '<p>Errors: We lost fuel cell batteries</p>';
echo $circuitFunction($errors);
echo('<hr>');
$errors[] = '<p>Errors: Hell, we created a new meme</p>';
$send = 'Report: Houston our mission is aborted';
echo $circuitFunction($errors);
//Report: Houston we have a problem:
//Errors: Containers with oxygen were exploded
//Errors: We lost fuel cell batteries
//--------------------------------------------
//Report: Houston we have a problem:
//Errors: Containers with oxygen were exploded
//Errors: We lost fuel cell batteries
//Errors: Hell, we created a new meme
Обратите внимание, перед вторым запуском $circuitFunction(), мы изменили переменную $send и изменили массив $errors! Но т.к. $send мы передавали в замыкание, эта переменная НЕ изменилась, а массив $errors изменился. В этом и заключается суть замыканий.