Забавное решение ;) Но Scope chain, т.е. несколько вложенных функций, уже не создать. Уже больше года не программировал на PHP (5.3а. застал ещё с замыканиями), так что, интересно было вспомнить. Спасибо. По поводу параметров call_user_func_array, которые передаются по значению — тоже полезная информация, равно как и трюк с debug_backtrace.
dsCode, почему же нельзя? С UPD # 2 вполне можно. :^) (Я проверил — работает прекрасно). В массиве closure хранится для каждой функции, так что никаких проблем с пересечением не будет. Единственное — я задумаюсь над способом генерации id (в некоторых случаях возможны коллизии.
> Эта ветка на первый взгляд кажется лишней.
Но на самом деле это не так. :^) Дело в том, что в самом окружении может быть переменная scope, и если она идёт не последней, то обычный порядок создания переменных окружения затрёт наш буфер $scope, а в конце переменная $scope будет всё равно уничтожена через unset (зачем этот массив в функции?). Вот для контроля за этой ситуацией ветка и написана.
PHP closures и передача аргументов по ссылке