PHP: Анонимные функции
Обращение к функциям через переменные
Функцию можно присвоить переменной, так же как и обычное значение. Для этого имя функции должно быть присвоено переменной в виде строки, но без указания круглых скобок:
<?php function foo() { echo "функция foo()<br>\n"; } $my_func = 'foo'; // Теперь мы можем запустить функцию foo() при помощи переменной $my_func, // которая хранит имя указанной функции в виде строки $my_func(); // Вызываем функцию foo() ?>
Такая концепция PHP имеет название «переменные-функции». Она заключается в том, что если добавить к переменной в конце круглые скобки, то интерпретатор PHP проверит сначала, не существует ли функции с именем равным значению переменной и если такая функция есть - выполнит ее.
Так, как показано в примере выше, можно делать только с функциями определенными пользователями. Встроенные языковые конструкции и функции, такие как echo, unset(), isset()
и другие подобные им нельзя таким же образом напрямую присвоить переменным. Но можно сделать свою функцию-обертку (wrapper) для того, чтобы встроенные языковые конструкции могли работать подобно пользовательским функциям.
<?php // Функция-обертка для echo function foo($str) { echo $str; } $my_func = 'foo'; $my_func('test'); // Вызывает функцию foo() ?>
Анонимные функции
Анонимная функция - функция, у которой нет собственного имени, иногда можно встретить и другое название таких функций - лямбда функция. Анонимные функции можно передавать другим функциям в качестве аргументов или присваивать переменным, как обычные значения:
<?php $my_func = function($str) { echo "hello $str"; }; // точка с запятой обязательна $my_func('World!'); ?>
Обратите внимание на пример, в конце определения функции есть точка с запятой, так как анонимная функция является по своей сути значением, и мы присваиваем значение переменной, то в конце как и для обычных инструкций ставится точка с запятой.
Анонимные функции отличаются от именованных тем, что создаются только в тот момент, когда до них доходит выполнение, поэтому воспользоваться ими можно только после их определения:
<?php // этот пример вызовет ошибку $my_func('World!'); $my_func = function($str) { echo "hello $str"; }; ?>
С этой темой смотрят: