Не можете вызвать закрытие, завернутое в закрытие?

Если я закрываю закрытие в другом закрытии, я не могу вызвать вложенное закрытие. Почему нет? Я думаю, что пример лучше всего иллюстрирует проблему.

Этот код 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"; });