PHP call_user_func与仅调用函数

时间:2009-10-20 17:46:19

标签: php function

我确信对此有一个非常简单的解释。有什么区别:

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');

8 个答案:

答案 0 :(得分:80)

当您知道它时,请始终使用实际的功能名称。

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

答案 1 :(得分:31)

虽然您可以这样调用变量函数名称:

function printIt($str) { print($str); }

$funcname = 'printIt';
$funcname('Hello world!');

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

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);

答案 2 :(得分:15)

call_user_func选项就在那里,您可以执行以下操作:

$dynamicFunctionName = "barber";

call_user_func($dynamicFunctionName, 'mushroom');

其中dynamicFunctionName字符串可能更令人兴奋并在运行时生成。除非必须,否则不应使用call_user_func,因为它较慢。

答案 3 :(得分:7)

我认为调用一个你事先不知道名字的函数是有用的... 类似的东西:

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

call_user_func($func, 'stuff');

答案 4 :(得分:3)

调用这个函数没有任何好处,因为我认为它主要用于调用“user”函​​数(如插件),因为编辑核心文件不是一个好选择。这是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

答案 5 :(得分:2)

使用PHP 7,您可以在任何地方使用更好的变量函数语法。它适用于静态/实例函数,它可以采用一系列参数。有关详情,请访问https://trowski.com/2015/06/20/php-callable-paradox

public SeatingChart(File file) throws FileNotFoundException, DataFormatException, IOException
{
    Scanner scan = new Scanner(file);
    int rows = 0;
    int columns = 0;
    String rowStr = "";
    String colStr = "";

    if (scan.hasNext())
    {
        rowStr = scan.next();
        colStr = scan.next();
    }

    rows = Integer.parseInt(rowStr);
    columns = Integer.parseInt(colStr);

    seats = new Student[rows][columns];

    scan.close();
}

答案 6 :(得分:0)

在你的第一个例子中,你正在使用函数名,这是一个字符串。它可能来自外部或在飞行中确定。也就是说,您不知道在代码创建时需要运行什么功能。

答案 7 :(得分:-1)

使用名称空间时,call_user_func()是运行您不知道事先名称的函数的唯一方法,例如:

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

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

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

编辑: 在@Jannis说我错了后,我做了一些测试,并没有太多运气:

<?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()'
}

你可以在这里看到输出结果:https://3v4l.org/iBERh似乎第二种方法适用于PHP 7以上,但不适用于PHP 5.6。