Здравствуй, дорогой читатель. В данной заметке я хотел бы рассказать вам об одной особенности, описанной в документации, но не особо используемой или не нашедшей своё место в современном PHP-мире.
Объявление функций внутри других функций
Допустим, вы решили определить одну функцию, которая будет регистрировать другие функции.
Такое поведение не совсем типично, но, возможно, имеет свои преимущества и способы применения.
function init() { function end($resource) { // некоторая работа по завершению всех операций со связанным ресурсом } // некоторая работа, возможно создание ресурсов return $resource; // возвращение какого-то результата }
Объявление функций внутри методов
Определяете вы класс, методы, тела методов, и в один прекрасный момент вы, прочитав stackoverflow или reddit, и попробовав запустить это на 3v4l.org, осознаёте, что возможность, которую PHP интерпретатор предоставляет, является с одной стороны очень спорной, а с другой дает возможность определять какую-либо функциональность только по запросу.
class test { function register() { if (!function_exists('test_init')) { function test_init() { echo 'Initializing library'.PHP_EOL; } } } } $test = new test; $test->register(); test_init();
Этот код успешно выполняется на PHP 4.x (>=4.3.10), PHP 5 (>=5.0.5), PHP 7 и HHVM.
Видимо, такая функциональность кому-то была нужна, и ещё в 2005-м году был создан баг, описывающий данную функциональность.
P.S: В 2015-м году использовать глобальные функции уже совсем необязательно, а уж тем более определять вложенные, но эта возможность жива и скорее всего еще не скоро будет удалена из языка.
ссылка на оригинал статьи http://habrahabr.ru/post/260049/
Добавить комментарий