#php #anonymous-function #php-5.2
#php #анонимная функция #php-5.2
Вопрос:
Я знаю, что можно сделать следующее с PHP 5.3 (анонимные функции), но есть ли аналогичная альтернатива в более старой версии PHP (до версии 5.3)?
$exampleArray = array(
'func' => function() {
echo 'this is an example';
}
Возможно ли это сделать с помощью __call или сначала ввести тип функции как (объекта)? Кроме того, я попытался сделать функцию неанонимной, присвоив ей имя, но, похоже, это не сработало.
Ответ №1:
Если вы хотите создать анонимную версию в PHP < 5.3, вы можете использовать create_function
функцию. Также здесь есть интересная информация об обратных вызовах (может оказаться полезной).
Пример использования create_function
# This (function in other variable is only for cleaner code)
$func = create_function('', "echo 'This is example from anoymus function';");
$exampleArray = array(
'func' => $func
);
Но вы можете сделать то же самое, используя приведенный выше код, альтернативным способом:
# Create some function
function func()
{
# Do something
echo 'This is example';
}
# Save function name
$func = 'func';
Приведенный выше код создает функцию, которая что-то делает, затем мы сохраняем имя функции в переменной (может быть передано как параметр и т.д.).
Вызываем функцию, когда мы знаем только ее имя:
Первый способ
$func();
Альтернатива
call_user_func($func);
Итак, пример, который соединяет все вышеописанное:
function primitiveArrayStep(amp;$array, $function)
{
# For loop, foreach can also be used here
for($i = 0; $i < count($array);$i )
{
# Check if $function is callable
if( is_callable($function) )
{
# Call function
$function(amp;$array[$i]);
}
else
{
# If not, do something here
}
}
}
И использование вышеупомянутой функции:
$array = array('a', 'b', 'c');
$myFunction = create_function('amp;$e', '$e = $e . " and i was here";');
primitiveArrayStep($array, $myFunction);
echo '<pre>';
var_dump($array);
ВОЗВРАТ:
array(3) {
[0]=>
string(16) "a and i was here"
[1]=>
string(16) "b and i was here"
[2]=>
string(16) "c and i was here"
}
Ссылки:
Ответ №2:
Да, можно создавать функции lamda в PHP до версии 5.3, используя create_function. Невозможно создать замыкания, хотя в вашем вопросе упоминается, но фактически не используется.
Закрытие — это функция lamda, которая имеет доступ (закрывается поверх) переменной из охватывающей ее области:
$t = new Thingy;
$func = function( $y ) use( $t ) {
//$t is available here when this function is called;
}
Функция lamda — это анонимная функция, полезная для хранения в переменной или передачи в качестве аргумента и т.д. Вы можете использовать create_function()
версию 5.3 следующим образом:
$func = create_function( '$y', 'echo $y;' );
//similar to
$func = function( $y ){ echo $y };
Ответ №3:
$exampleArray = array(
'func' => create_function('', 'echo "this is an example"');
);
Комментарии:
1. Вдохновляющий ответ. Я многому научился. Такое ощущение, что этот ответ заслуживает гораздо большего внимания. Такие возможности PHP.
Ответ №4:
Как насчет простого создания класса с ‘func’ в качестве метода класса? Будет работать до или после 5.3.