Если я закрываю закрытие в другом закрытии, я не могу вызвать вложенное закрытие. Почему нет? Я думаю, что пример лучше всего иллюстрирует проблему.
Этот код PHP:
function FInvoke($func) { $func(); } FInvoke(function () { echo "Direct Invoke Worked\n"; });
Работает так, как ожидалось, и печатает «Direct Invoke Worked».
Однако, если я немного модифицирую его, чтобы добавить еще один уровень косвенности, он терпит неудачу:
function FInvoke($func) { $func(); } function FIndirectInvoke($func) { FInvoke(function () { $func(); }); } FIndirectInvoke(function () { echo "Never makes it here"; });
Сообщение об ошибке «Неустранимая ошибка: имя функции должно быть строкой в файле.php в строке X»
вам нужно передать $ func во внутреннюю лямбду, используя ключевое слово «use»
function FInvoke($func) { $func(); } function FIndirectInvoke($func) { FInvoke(function () use($func) { // <--- here $func(); }); } FIndirectInvoke(function () { echo "ok"; });