Pull to refresh

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

Reading time1 min
Views18K
Здравствуй, дорогой читатель. В данной заметке я хотел бы рассказать вам об одной особенности, описанной в документации, но не особо используемой или не нашедшей своё место в современном PHP-мире.


Объявление функций внутри других функций


Допустим, вы решили определить одну функцию, которая будет регистрировать другие функции.
Такое поведение не совсем типично, но, возможно, имеет свои преимущества и способы применения.
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-м году использовать глобальные функции уже совсем необязательно, а уж тем более определять вложенные, но эта возможность жива и скорее всего не скоро будет удалена из языка.
Tags:
Hubs:
Total votes 27: ↑16 and ↓11+5
Comments11

Articles