Функция как значение массива - PullRequest
13 голосов
/ 25 февраля 2012

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

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

Спасибо! * * 1004

Ответы [ 4 ]

14 голосов
/ 25 февраля 2012

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

<?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));
5 голосов
/ 25 февраля 2012

проверить 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);
}

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

5 голосов
/ 25 февраля 2012

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

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

Yout может проверить больше примеров в руководстве .

4 голосов
/ 25 февраля 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...