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

JD *_*cks 44 php parameters function

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

function ($functionToBeCalled)
{
   call($functionToBeCalled,additional_params);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点..我使用的是PHP 4.3.9

谢谢!

Pao*_*ino 78

我想你在找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");
?>
Run Code Online (Sandbox Code Playgroud)

  • 蘑菇理发规则! (49认同)
  • 那么当理发师属于另一个班级时会发生什么?不同名称空间 (7认同)

Ste*_*son 27

在php中这很简单.

<?php

function here() {
  print 'here';
}


function dynamo($name) {
 $name();
}

//Will work
dynamo('here');
//Will fail
dynamo('not_here');
Run Code Online (Sandbox Code Playgroud)


tj1*_*111 26

function foo($function) {
  $function(" World");
}
function bar($params) {
  echo "Hello".$params;
}

$variable = 'bar';
foo($variable);
Run Code Online (Sandbox Code Playgroud)

此外,您可以这样做.查看变量函数.

  • 我想你在那里跳了一下枪.IIRC,该代码在PHP 5.3发布之前不会开始工作. (3认同)

小智 11

你也可以用call_user_func_array().它允许您传递一个参数数组作为第二个参数,因此您不必确切地知道您传递了多少变量.


mer*_*ial 11

我知道有关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');
Run Code Online (Sandbox Code Playgroud)

显然,在这个例子中,这并没有给你带来太大的好处 - 当你将这些匿名函数传递给其他函数时(例如在原始问题中),功能和灵活性就会出现.所以你可以这样做:

$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";
Run Code Online (Sandbox Code Playgroud)

当然,这可以使用call_user_func来完成,但我发现这种语法更加清晰,特别是一旦涉及名称空间和成员变量.

一个警告:我将是第一个承认我不确切知道这里发生了什么的人,但是你不能总是调用包含在成员或静态变量中的闭包,并且可能在其他一些情况下.但是将其重新分配给局部变量将允许调用它.因此,例如,这会给您一个错误:

$some_value = \SomeNamespace\SomeClass::$closure($arg1, $arg2);
Run Code Online (Sandbox Code Playgroud)

但是这个简单的解决方法解决了这个问题:

$the_closure = \SomeNamespace\SomeClass::$closure;
$some_value = $the_closure($arg1, $arg2);
Run Code Online (Sandbox Code Playgroud)


w41*_*1 3 6

如果你需要带参数作为参数的传递函数,你可以试试这个:

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'
Run Code Online (Sandbox Code Playgroud)

phpfiddle的例子

希望它会有所帮助......