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";
};
?>
С этой темой смотрят: