PHP передать функцию в качестве параметра, а затем вызвать функцию?

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

function ($functionToBeCalled) { call($functionToBeCalled,additional_params); } 

Есть ли способ сделать это. Я использую PHP 4.3.9

Благодаря!

Я думаю, вы ищете call_user_func .

Пример из руководства PHP:

 <?php function barber($type) { echo "You wanted a $type haircut, no problem"; } call_user_func('barber', "mushroom"); call_user_func('barber', "shave"); ?> 
 function foo($function) { $function(" World"); } function bar($params) { echo "Hello".$params; } $variable = 'bar'; foo($variable); 

Кроме того, вы можете сделать это таким образом. См. Функции переменных .

В php это очень просто.

 <?php function here() { print 'here'; } function dynamo($name) { $name(); } //Will work dynamo('here'); //Will fail dynamo('not_here'); 

Вы также можете использовать call_user_func_array() . Он позволяет передавать массив параметров в качестве второго параметра, поэтому вам не нужно точно знать, сколько переменных вы передаете.

Я знаю исходный вопрос, заданный о PHP 4.3, но теперь это несколько лет спустя, и я просто хотел отстаивать свой предпочтительный способ сделать это в PHP 5.3 или новее.

PHP 5.3+ теперь включает поддержку анонимных функций (закрытий) , поэтому вы можете использовать некоторые стандартные методы функционального программирования, например, в таких языках, как JavaScript и Ruby (с несколькими оговорками). Переписывание примера call_user_func выше в «стиле закрытия» будет выглядеть так, что я считаю более элегантным:

 $barber = function($type) { echo "You wanted a $type haircut, no problem\n"; }; $barber('mushroom'); $barber('shave'); 

Очевидно, что в этом примере это не так много покупает – сила и гибкость возникают, когда вы передаете эти анонимные функции другим функциям (как в исходном вопросе). Таким образом, вы можете сделать что-то вроде:

 $barber_cost = function($quantity) { return $quantity * 15; }; $candy_shop_cost = function($quantity) { return $quantity * 4.50; // It's Moonstruck chocolate, ok? }; function get_cost($cost_fn, $quantity) { return $cost_fn($quantity); } echo '3 haircuts cost $' . get_cost($barber_cost, 3) . "\n"; echo '6 candies cost $' . get_cost($candy_shop_cost, 6) . "\n"; 

Это может быть сделано с помощью call_user_func, конечно, но я нахожу этот синтаксис более понятным, особенно после того, как задействуются пространства имен и переменные-члены.

Одно предостережение: я буду первым, кто признает, что я точно не знаю, что здесь происходит, но вы не можете всегда вызывать замыкание, содержащееся в членной или статической переменной, и, возможно, в некоторых других случаях. Но переназначение его на локальную переменную позволит ему вызываться. Так, например, это даст вам ошибку:

 $some_value = \SomeNamespace\SomeClass::$closure($arg1, $arg2); 

Но это простое решение проблемы:

 $the_closure = \SomeNamespace\SomeClass::$closure; $some_value = $the_closure($arg1, $arg2); 

Если вам нужна функция pass с параметром как параметром, вы можете попробовать следующее:

 function foo ($param1){ return $param1; } function bar ($foo_function, $foo_param){ echo $foo_function($foo_param); } //call function bar bar('foo', 'Hi there'); //this will print: 'Hi there' 

Пример phpfiddle

Надеюсь, это будет полезно …