PHP的传递函数作为参数然后调用函数?

我需要将一个函数作为parameter passing给另一个函数,然后从函数内部调用传递的函数…这可能更容易在代码中解释..我基本上想要做这样的事情:

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() 。 它允许你传递一个参数数组作为第二个参数,所以你不必知道你传递了多less个variables。

我知道关于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来完成,但是我觉得这个语法更加清晰,特别是一旦名称空间和成员variables被涉及到。

一个告诫:我会第一个承认我不知道这里到底发生了什么,但是你不能总是调用成员或静态variables中包含的闭包,也可能在其他情况下。 但重新分配给一个局部variables将允许它被调用。 所以,例如,这会给你一个错误:

 $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的例子

希望这会有帮助…