Подтвердить что ты не робот

Функция как значение массива

Я не могу найти ничего из этого, и мне было интересно, можно ли хранить ссылку на функцию или функцию как значение для элемента массива. Напр.

array("someFunc" => &x(), "anotherFunc" => $this->anotherFunc())

Спасибо!

4b9b3361

Ответ 1

Вы можете "ссылаться" на любую функцию. Ссылка на функцию не является ссылкой в ​​смысле "адрес в памяти" или что-то в этом роде. Это просто имя функции.

<?php

$functions = array(
  'regular' => 'strlen',
  'class_function' => array('ClassName', 'functionName'),
  'object_method' => array($object, 'methodName'),
  'closure' => function($foo) {
    return $foo;
  },
);

// while this works
$functions['regular']();
// this doesn't
$functions['class_function']();

// to make this work across the board, you'll need either
call_user_func($functions['object_method'], $arg1, $arg2, $arg3);
// or
call_user_func_array($functions['object_method'], array($arg1, $arg2, $arg3));

Ответ 2

PHP поддерживает концепцию переменных функций, поэтому вы можете сделать что-то вроде этого:

function foo() { echo "bar"; }
$array = array('fun' => 'foo');
$array['fun']();

Yout может проверить больше примеров в manual.

Ответ 3

проверить PHP call_user_func. рассмотрим приведенный ниже пример.

рассмотрим две функции

function a($param)
{
    return $param;
}

function b($param)
{
    return $param;
}


$array = array('a' => 'first function param', 'b' => 'second function param');

теперь, если вы хотите выполнить всю функцию в последовательности, вы можете сделать это с помощью цикла.

foreach($array as $functionName => $param) {
    call_user_func($functioName, $param);
}

плюс массив может содержать любой тип данных, будь то вызов функции, вложенные массивы, объект, строка, целое число и т.д. и т.д.

Ответ 4

Да, вы можете:

$array = array(
    'func' => function($var) { return $var * 2; },
);
var_dump($array['func'](2));

Это, конечно же, требует поддержки PHP анонимной функции, которая поступает с PHP версии 5.3.0. Это все равно оставит вас с довольно нечитаемым кодом.