PHP的call_user_func与只是调用函数

我相信这个有一个非常简单的解释。 这有什么区别:

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

…这(有什么好处?):

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

提前致谢。

当你知道的时候总是使用实际的function名称。

call_user_func用于调用其名称不是提前知道的函数,但是由于程序必须在运行时查找函数,因此它的效率会低很多。

虽然你可以这样调用variables函数的名字:

 function printIt($str) { print($str); } $funcname = 'printIt'; $funcname('Hello world!'); 

有些情况下你不知道你传递了多less个参数。 考虑以下:

 function someFunc() { $args = func_get_args(); // do something } call_user_func_array('someFunc',array('one','two','three')); 

分别调用静态和对象方法也很方便:

 call_user_func(array('someClass','someFunc'),$arg); call_user_func(array($myObj,'someFunc'),$arg); 

call_user_func选项在那里,所以你可以做这样的事情:

 $dynamicFunctionName = "barber"; call_user_func($dynamicFunctionName, 'mushroom'); 

其中dynamicFunctionNamestring可能更令人兴奋,并在运行时生成。 除非必须,否则不应该使用call_user_func,因为速度较慢。

我想这是有用的调用一个函数,你不知道事先的名字…是这样的:

 switch($value): { case 7: $func = 'run'; break; default: $func = 'stop'; break; } call_user_func($func, 'stuff'); 

调用这样的函数没有任何好处,因为我认为它主要用于调用“用户”函数(如插件),因为编辑核心文件不是好的select。 这里是由Wordpress使用的肮脏的例子

 <?php /* * my_plugin.php */ function myLocation($content){ return str_replace('@', 'world', $content); } function myName($content){ return $content."Tasikmalaya"; } add_filter('the_content', 'myLocation'); add_filter('the_content', 'myName'); ?> 

 <?php /* * core.php * read only */ $content = "hello @ my name is "; $listFunc = array(); // store user function to array (in my_plugin.php) function add_filter($fName, $funct) { $listFunc[$fName]= $funct; } // execute list user defined function function apply_filter($funct, $content) { global $listFunc; if(isset($listFunc)) { foreach($listFunc as $key => $value) { if($key == $funct) { $content = call_user_func($listFunc[$key], $content); } } } return $content; } function the_content() { $content = apply_filter('the_content', $content); echo $content; } ?> 

….

 <?php require_once("core.php"); require_once("my_plugin.php"); the_content(); // hello world my name is Tasikmalaya ?> 

产量

 hello world my name is Tasikmalaya 

在你的第一个例子中,你正在使用函数名称,这是一个string。 它可能来自外部或在飞行中被确定。 也就是说,您不知道在创build代码时需要运行哪个函数。

当使用名称空间时,call_user_func()是运行一个你不知道名字的函数的唯一方法,例如:

 $function = '\Utilities\SearchTools::getCurrency'; call_user_func($function,'USA'); 

如果你所有的函数都在同一个命名空间中,那么就不会有这样的问题,因为你可以使用类似这样的东西:

 $function = 'getCurrency'; $function('USA'); 

编辑:继@Jannis说我错了我做了更多的testing,并没有太多的运气:

 <?php namespace foo { class Bar { public static function getBar() { return 'Bar'; } } echo "<h1>Bar: ".\foo\Bar::getBar()."</h1>"; // outputs 'Bar: Bar' $function = '\foo\Bar::getBar'; echo "<h1>Bar: ".$function()."</h1>"; // outputs 'Fatal error: Call to undefined function \foo\Bar::getBar()' $function = '\foo\Bar\getBar'; echo "<h1>Bar: ".$function()."</h1>"; // outputs 'Fatal error: Call to undefined function \foo\Bar\getBar()' }