PHP: создать глобальную функцию из анонимной функции

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

Сценарий сна будет выглядеть так:

$functionName = "new_super_function";
$functionBody = function($a,$b) { return $a + $b; };

if ( !function_exists($functionName) ) create_function($functionName, $functionBody);

//from here my function with dynamic name is ready
//I could now call it like call_user_func($functionName, 5, 7) => 12
//or just use it later like new_super_function(5,7) => 12

Я искал такую ​​возможность, но ничего не мог найти. Есть идеи?

1

Решение

Просто назначьте тело функции для имени функции следующим образом:

$functionName = "new_super_function";
$functionBody = function($a,$b) { return $a + $b; };

if (!function_exists($functionName))
$functionName = $functionBody;

echo call_user_func($functionName, 5, 7);  //Same as: echo $functionName(5, 7);

выход:

12

РЕДАКТИРОВАТЬ:

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

3

Другие решения

Я думал, что было бы весело попытаться ответить на него. Вы должны создать свой собственный create_function метод.

function my_create_function($name, $callable) {
$GLOBALS['my_functions'][$name] = $callable;

$call_wrapper = sprintf('function %s() {
$arguments = func_get_args();
return call_user_func_array($GLOBALS["my_functions"][%s], $arguments);
}', $name, $name);

eval($call_wrapper);
}

Тестовое задание:

class Test {
static public function prepare() {
$add_function = function($a, $b) { return $a + $b; };

var_dump($add_function(1, 2));

my_create_function('my_add', $add_function);
}

static public function testit() {
var_dump(call_user_func('my_add', 1, 2));

var_dump(call_user_func_array('my_add', array(1, 2)));

var_dump(my_add(1, 2));
}
}

Test::prepare();
Test::testit();
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector