When to use call_user_func() and 'funcname'() in PHP?

There are 2 ways to call a function whose name is set at runtime in PHP. One is call_user_func() and another is 'funcname'().

<?php

$funcname = 'array_sum';

// call_user_func()
call_user_func($funcname, [1, 2, 3]);  // => 6

// 'funcname'()
$funcname([1, 2, 3]);  // => 6

At a glance these 2 methods are completely same but there are some important differences between them. Let's check them one by one.

call_user_func()

  • Can take anonymous functions (which is called "closure" in PHP).

  • Can take instance methods.

<?php

class Groot {
  public function talk() {
    print 'I am Groot.';
  }
}

// Instance methods can be passed.
$g = new Groot();
call_user_func([$g, 'talk']);  // => I am Groot.
  • Can take static methods.
<?php

class Terminator {
  public static function sayGoodbye() {
    print 'Hasta la vista, baby.';
  }
}

// Static methods can be passed.
call_user_func('Terminator::sayGoodbye');  // => Hasta la vista, baby.

'funcname'()

  • Can take parameters as reference. call_user_func() always takes parameters as value and cannot do this.
<?php

$funcname = 'array_pop';

$a = [3, 4, 5];
// Parameters can be passed as reference.
$funcname($a);
var_dump($a);
// => array(2) {
//   [0]=>
//   int(3)
//   [1]=>
//   int(4)
// }

So, for example, if we want to call a static method, we should use call_user_func(). On the other hand, we can use only $funcname() in order to pass parameters as reference.

These 2 methods look same but we need to know that they're completely difference 2 things.

(FYI, there's call_user_func_array() which takes all parameters as an array.)

Additional notes: whereas call_user_func() takes the parameters only as values, call_user_func_array() can take parameters as reference.