PHP call_user_func vs. just calling function

前端 未结 8 1548
我寻月下人不归
我寻月下人不归 2020-12-04 08:06

I\'m sure there\'s a very easy explanation for this. What is the difference between this:

function barber($type){
    echo \"You wanted a $type haircut, no         


        
相关标签:
8条回答
  • 2020-12-04 08:36

    Although you can call variable function names this way:

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

    there are cases where you don't know how many arguments you're passing. Consider the following:

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

    It's also handy for calling static and object methods, respectively:

    call_user_func(array('someClass','someFunc'),$arg);
    call_user_func(array($myObj,'someFunc'),$arg);
    
    0 讨论(0)
  • 2020-12-04 08:40

    With PHP 7 you can use the nicer variable-function syntax everywhere. It works with static/instance functions, and it can take an array of parameters. More info at https://trowski.com/2015/06/20/php-callable-paradox

    $ret = $callable(...$params);
    
    0 讨论(0)
  • 2020-12-04 08:40

    When using namespaces, call_user_func() is the only way to run a function you don't know the name of beforehand, for example:

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

    If all your functions were in the same namespace, then it wouldn't be such an issue, as you could use something like this:

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

    Edit: Following @Jannis saying that I'm wrong I did a little more testing, and wasn't having much luck:

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

    You can see the output results here: https://3v4l.org/iBERh it seems the second method works for PHP 7 onwards, but not PHP 5.6.

    0 讨论(0)
  • 2020-12-04 08:41

    the call_user_func option is there so you can do things like:

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

    where the dynamicFunctionName string could be more exciting and generated at run-time. You shouldn't use call_user_func unless you have to, because it is slower.

    0 讨论(0)
  • 2020-12-04 08:45

    I imagine it is useful for calling a function that you don't know the name of in advance... Something like:

    switch($value):
    {
      case 7:
      $func = 'run';
      break;
      default:
      $func = 'stop';
      break;
    }
    
    call_user_func($func, 'stuff');
    
    0 讨论(0)
  • 2020-12-04 08:49

    Always use the actual function name when you know it.

    call_user_func is for calling functions whose name you don't know ahead of time but it is much less efficient since the program has to lookup the function at runtime.

    0 讨论(0)
提交回复
热议问题