代码之家  ›  专栏  ›  技术社区  ›  jay

php调用用户func与只调用函数

  •  81
  • jay  · 技术社区  · 15 年前

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

    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 回复  |  直到 7 年前
        1
  •  79
  •   Kai    15 年前

    当您知道实际的函数名时,一定要使用它。

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

        2
  •  31
  •   Lucas Oman    15 年前

    尽管可以这样调用变量函数名:

    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);
    
        3
  •  15
  •   Brienne Schroth    15 年前

    这个 call_user_func 选项是这样的,所以你可以做如下的事情:

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

    何处 dynamicFunctionName 字符串可能更令人兴奋,并在运行时生成。你不应该使用call-user-func,除非你必须这样做,因为它比较慢。

        4
  •  7
  •   pivotal    15 年前

    我想它对于调用一个你事先不知道的函数很有用… 类似:

    switch($value):
    {
      case 7:
      $func = 'run';
      break;
      default:
      $func = 'stop';
      break;
    }
    
    call_user_func($func, 'stuff');
    
        5
  •  3
  •   uingtea    9 年前

    调用这样的函数没有好处,因为我认为它主要用于调用“用户”函数(比如插件),因为编辑核心文件不是一个好的选择。下面是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
    
        6
  •  1
  •   mils    7 年前

    使用php 7,您可以在任何地方使用更好的变量函数语法。它可以使用静态/实例函数,并且可以获取参数数组。更多信息 https://trowski.com/2015/06/20/php-callable-paradox

    $ret = $callable(...$params);
    
        7
  •  0
  •   SilentGhost    15 年前

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

        8
  •  -1
  •   ThomasRedstone    7 年前

    使用名称空间时,调用_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。