- When to use call_user_func_array
- 4 Answers 4
- An example of where call_user_func_array is very useful
- call_user_func_array
- Список параметров
- Возвращаемые значения
- Список изменений
- Примеры
- Примечания
- Смотрите также
- PHP call_user_func_array
- Introduction to the PHP call_user_func_array() function
- PHP call_user_func_array function example
- Summary
When to use call_user_func_array
I’ve read other answers on stack pertaining to using call_user_func_array vs just calling the function but I still can’t glean when the former should be used. I get that you might want to use call_user_func_array when you don’t know how many args are passed thus you can do: $args = func_get_args(); . but don’t you always need to know the arguments if they are to be used in a function? Both of the following work, I assume the first has less overhead.
$format = new Foo; $method = 'somemethod'; $arg = 'somevalue'; if (method_exists($format, $method)) < return $format->$method($arg); >
return call_user_func_array(array($format, $method), array($arg));
I’ve seen and used it in static classes where an instance of a concrete class has been imported, and it is desired to access the concrete class through static methods.
when your PHP version does not support stored function name calls (5.4?). also func_get_args is often used when variadics does not supported (5.6). however i’ve seen so far its a matter of preference. being consistent is the key.
Now with argument unpacking it kinda makes this function mute, as that was the argument in answers here: stackoverflow.com/questions/18526060/… suppose it just comes down to if you want to support old php versions.
4 Answers 4
An example of where call_user_func_array is very useful
Lets say you have a desire to access an object, but through static methods, like this:
Well, that won’t work by itself, because if you look at the concrete class it doesn’t have the static method:
class Helper < public function load() < // Do some loading . >public function aFunctionThatNeedsParameters( $param1, $param2 ) < // Do something, and $param1 and $param2 are required . >>
So in a second class, we could do something like this, because the Helper class above is loaded into a dependency injection container (note that these two Helper classes are named the same, but would be in different namespaces):
class Helper extends DIContainer < public static $helper_instance = NULL; public static function get_instance() < if( is_null( self::$helper_instance ) ) < self::$helper_instance = parent::$container['helper']; >return self::$helper_instance; > public static function __callStatic( $method, $params ) < $obj = self::get_instance(); return call_user_func_array( [ $obj, $method ], $params ); >>
The thing is, there may be another method that needs parameters, even though our load method doesn’t have any.
So in this case we can use Helper::load() , but also Helper::aFunctionThatNeedsParameters( $param1, $param2 )
I think this is used a lot in PHP frameworks that know that static classes are not usually appropriate, but they want the ability to call methods as if they were static. I hope this makes sense.
call_user_func_array
Вызывает пользовательскую функцию callback , с параметрами из массива param_arr .
Список параметров
Передаваемые в функцию параметры в виде индексированного массива.
Возвращаемые значения
Возвращает результат функции или FALSE в случае ошибки.
Список изменений
Версия | Описание |
---|---|
5.3.0 | Изменилась интерпретация объектно-ориентированных ключевых слов, таких как parent и self. Ранее их вызов с помощью синтаксиса двойного двоеточия вызывал предупреждение уровня E_STRICT , так как они расценивались как статические вызовы. |
Примеры
Пример #1 Пример использования функции call_user_func_array()
function foobar ( $arg , $arg2 ) echo __FUNCTION__ , » got $arg and $arg2 \n» ;
>
class foo function bar ( $arg , $arg2 ) echo __METHOD__ , » got $arg and $arg2 \n» ;
>
>
?php
// Вызываем функцию foobar() с 2 аргументами
call_user_func_array ( «foobar» , array( «one» , «two» ));
// Вызываем метод $foo->bar() с 2 аргументами
$foo = new foo ;
call_user_func_array (array( $foo , «bar» ), array( «three» , «four» ));
?>
Результатом выполнения данного примера будет что-то подобное:
foobar got one and two foo::bar got three and four
Пример #2 Пример использования call_user_func_array() и имени из пространства имен
class Foo static public function test ( $name ) print «Hello < $name >!\n» ;
>
>
// Начиная с версии PHP 5.3.0
call_user_func_array ( __NAMESPACE__ . ‘\Foo::test’ , array( ‘Hannes’ ));
// Начиная с версии PHP 5.3.0
call_user_func_array (array( __NAMESPACE__ . ‘\Foo’ , ‘test’ ), array( ‘Philip’ ));
Результатом выполнения данного примера будет что-то подобное:
Hello Hannes! Hello Philip!
Пример #3 Использование lambda-функции
$func = function( $arg1 , $arg2 ) return $arg1 * $arg2 ;
>;
var_dump ( call_user_func_array ( $func , array( 2 , 4 ))); /* Начиная с версии PHP 5.3.0 */
Результат выполнения данного примера:
Примечания
Замечание:
До PHP 5.4 переменные-ссылки в param_arr передавались в функции по ссылке вне зависимости от того, ожидает ли функция передачу соответствующего параметра по ссылке или нет. При использовании этого вида «динамической» передачи по ссылке не выводится предупреждение об устаревшем поведении, но тем не менее такая передача считается устаревшей и была удалена в PHP 5.4. Кроме того, это не влияет на встроенные функции, у которых учитывается сигнатура функции. Передача параметра функции по значению при ожидаемой передаче по ссылке вызовет предупреждение и заставит call_user_func() вернуть FALSE (однако имеется исключение для передаваемых значений, у которых количество ссылок равно 1, также как у литералов, поскольку последние могут быть преобразованы в ссылки без побочных последствий, однако запись значения в такие параметры не имеет никакого эффекта. Не полагайтесь на такое поведение, все-таки количество ссылок — это подробности реализации и правильность такого режима работы вызывает сомнения).
Замечание:
Callback-функции, зарегистрированные такими функциями как call_user_func() и call_user_func_array() , не будут вызваны при наличии не пойманного исключения, брошенного в предыдущей callback-функции.
Смотрите также
- call_user_func() — Вызывает пользовательскую функцию, указанную в первом параметре
- информация о типе callback
- ReflectionFunction::invokeArgs() — Вызов функции с передачей аргументов
- ReflectionMethod::invokeArgs() — Вызов метода с передачей аргументов массивом
PHP call_user_func_array
Summary: in this tutorial, you’ll learn about the call_user_func_array() function and how to use it to call a function dynamically.
Introduction to the PHP call_user_func_array() function
The call_user_func_array() function calls a callback function with parameters. Here’s the syntax of the call_user_func_array() function:
call_user_func_array(callable $callback, array $args): mixed
Code language: PHP (php)
The call_user_func_array() has two parameters:
- $callback is the name of a function or any callable that will be called.
- $args is an array that contains parameters of the $callback .
The call_user_func_array() returns the value of the $callback .
PHP call_user_func_array function example
The following example illustrates how to use the call_user_func_array() function:
function add(int $a, int $b): int < return $a + $b; > $result = call_user_func_array('add',[10,20]); echo $result; // 30
Code language: PHP (php)
- First, define a function add() that returns the sum of two integers.
- Second, call the add() function via the call_user_func_array() function. The first argument is the function name, and the second argument is an array of arguments of the add() function.
- Third, show the result to the output.