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