Особенности работы анонимных функций

Любопытная проблема решение которой было найдено в неожиданном месте

В широко используемом в нашей работе языке программирования PHP анонимные функции появились начиная с версии 5.3, однако, несмотря на это, их использование в нашей практики по тем или иным причинам было существенно ограничено.

Пару слов об анонимных функциях или «замыканиях» (от лат. Closure - класса объекта фактически являющегося анонимной функции и хранящего передаваемые ей параметры) как их называют


Синтаксис предельно прост и очень близок синтаксису JavaScript в котором анонимные функции используются фундаментально, повсеместно и изначально.
 

$f = function($a, $b) use ($g){
    return $a+$b+$g;
};
$g=1;
echo $f(2,4);


На экране вместо привычного 'Hello world!' мы увидим 7

Вдохновившись удобством и элементарностью работы были написаны ряд классов существенно упрощающих жизнь для собственной системы управления. Замыкания использовались в качестве callback / функций обратного вызова, на мой взгляд самого, пожалуй естественного варианта их использования.

Функции продолжали свое триумфальное шествие по различным конструкторам до тех пор, пока не наткнулись на особый хостинг в рамках работы по модернизации сайтов возникла проблема. 

Присваиваем переменной $f функциюd конструкторе класса. Проверяем работу на следующей строке 
var_dump возвращает NULL уверенно и четко.

Перемещение по коду дает противоречивые результаты. Где то функция работает, где то нет. Закономерностей практически нет, вплоть до того что функция присваивается на строке кода x и не присваивается в строке x+1

В качестве параметра функция не передавалась с вероятностью 100%

Проверяем версию PHP - она новее чем на тестовом сервере. 

Причина оказалась не очевидна, но достаточно проста
Сервер на котором производились работы в качестве ускорителя и оптимизатора кода использовал eAccelerator. Именно это расширение PHP блокировало нормальную работу анонимных функций.

Проблема была полностью решена заменой eAccelerator на XCache, повезло, что такая возможность была.

Подписывайтесь

Поиск

Поделиться