2011-03-25 41 views
2

我正在尝试创建一个将另一个PHP函数作为输入的PHP函数。这里有一个例子:创建以函数作为参数的PHP函数

function getMean(function){ 
    $allUsers = getAllUsers(); 
    $sum = 0; 

    foreach ($allUsers as $currentUser){ 

     $sum =+ (function($currentUser['CONSUMER_ID'], 5, 8))/(8-5); 

    } 

} 
+0

你能解释一下你的问题好一点吗? – Neal 2011-03-25 15:48:16

+1

可能是http://stackoverflow.com/questions/2700433/pass-function-as-parameter-in-php – 2011-03-25 15:50:23

回答

4

也许这样的事情应该这样做。 PHP有一个叫做回调的“类型”,它可以是一个闭包(自PHP 5.3开始),包含对象的函数或数组的名称以及要调用的方法。这些回调函数可以调用call_user_func()

function getMean($callback){ 
    $allUsers = getAllUsers(); 
    $sum = 0; 

    foreach ($allUsers as $currentUser){ 
     $sum =+ (call_user_func($callback, $currentUser['CONSUMER_ID'], 5, 8))/(8-5); 
    } 

    return $sum; 
} 
+1

既然你不能输入提示,你可能想用'is_callable($ callback)'在if块中进行变形。 – prodigitalson 2011-03-25 15:52:46

0

你能做到这一点,只要function($currentUser['CONSUMER_ID'], 5, 8)回报的东西

0

它看起来像PHP Eval功能是你在找什么。通过getMean函数一个字符串,然后将该行更改为$ sum = +(eval($ param).....)

虽然安全性是一个问题,但因为可以传递任何函数。

+2

的副本号。回调类型无疑在这里更好。 – Artefact2 2011-03-25 15:50:35

+0

每天学点新东西 – MikeMurko 2011-03-25 15:51:51

0

将函数另存为变量。

$function = function($param1){ //code here } 

并将它作为参数传递给您的其他函数。

function getMean($function) 
{ 
    //code here 
    $sum += $function($param); 
} 

[编辑]

PHP.net Manual - Variable Functions

+0

我相信这需要php> = 5.3.0 – whoughton 2011-03-25 15:50:34

+0

@whoughton它没有在文档中指定,但我认为你是对的。 – 2011-03-25 15:56:18

+0

我认为你实际上是一个匿名函数/闭包,而不是一个可变函数。 HTTP:// PHP。净/手动/ EN/functions.anonymous.php – whoughton 2011-03-25 16:30:19

2

您需要PHP 5.3才能做到这一点。

function getMean($function){ 
    $allUsers = getAllUsers(); 
    $sum = 0; 

    foreach ($allUsers as $currentUser){ 

     $sum += ($function($currentUser['CONSUMER_ID'], 5, 8))/(8-5); 
    } 
    return $sum; 
} 

getMean(function($consumer_id, $five, $eight) { 
    return $consumer_id; 
}); 

我你运行PHP 5.3-(低于5.3),您需要与call_user_func()call_user_func_array()功能一起使用回调(documentation is here)。

0

如果你想动态创建一个函数在php < 5.3那么你坚持使用create_function。因为你如何使用这个功能,它真的很疯狂,除了为array_maparray_walk或者做简单计算或基本文本处理的事情创建简单功能外,其它任何东西都可以使用它。

如果你做的任何事情都比其他事情复杂得多,那么简单地定义这个函数就像正常一样,然后像其他人所建议的一样使用call_user_funccall_user_func_array

请勿使用eval :-)