Здравствуй, дорогой читатель. В данной заметке я хотел бы рассказать вам об одной особенности, описанной в документации, но не особо используемой или не нашедшей своё место в современном PHP-мире.
Допустим, вы решили определить одну функцию, которая будет регистрировать другие функции.
Такое поведение не совсем типично, но, возможно, имеет свои преимущества и способы применения.
Определяете вы класс, методы, тела методов, и в один прекрасный момент вы, прочитав stackoverflow или reddit, и попробовав запустить это на 3v4l.org, осознаёте, что возможность, которую PHP интерпретатор предоставляет, является с одной стороны очень спорной, а с другой дает возможность определять какую-либо функциональность только по запросу.
Этот код успешно выполняется на PHP 4.x (>=4.3.10), PHP 5 (>=5.0.5), PHP 7 и HHVM.
Видимо, такая функциональность кому-то была нужна, и ещё в 2005-м году был создан баг, описывающий данную функциональность.
P.S: В 2015-м году использовать глобальные функции уже совсем необязательно, а уж тем более определять вложенные, но эта возможность жива и скорее всего не скоро будет удалена из языка.
Объявление функций внутри других функций
Допустим, вы решили определить одну функцию, которая будет регистрировать другие функции.
Такое поведение не совсем типично, но, возможно, имеет свои преимущества и способы применения.
function init() {
function finish($resource) {
// некоторая работа по завершению всех операций со связанным ресурсом
}
$resource = null;
// некоторая работа, возможно создание ресурсов
return $resource; // возвращение какого-то результата
}
$resource = init();
finish($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-м году использовать глобальные функции уже совсем необязательно, а уж тем более определять вложенные, но эта возможность жива и скорее всего не скоро будет удалена из языка.