В широко используемом в нашей работе языке программирования 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, повезло, что такая возможность была.
© 2004—2024 Компания «Интернет-Технологии»,
Россия, Санкт-Петербург
+7 (812) 309-83-92, info@spbitec.ru
Версия сайта: 4.57.2