Одна из особенностей PHP, связанная с методами и функциями

от автора

Здравствуй, дорогой читатель. В данной заметке я хотел бы рассказать вам об одной особенности, описанной в документации, но не особо используемой или не нашедшей своё место в современном 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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *