PHP 8.4.2 Released!

call_user_func_array

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

call_user_func_arrayВызывает callback-функцию с массивом параметров

Описание

call_user_func_array(callable $callback, array $args): mixed

Вызывает callback-функцию callback, с параметрами из массива args.

Список параметров

callback

Вызываемая функция типа callable.

args

Передаваемые в функцию параметры в виде массива.

Если все ключи args являются числовыми, ключи игнорируются и каждый элемент будет передан в параметр callback как позиционный аргумент, по порядку.

Если какие-либо ключи args являются строками, эти элементы будут переданы в параметр callback как именованные аргументы, с именем, заданным ключом.

Произойдёт неисправимая ошибка, если числовой ключ в args появляется после строкового ключа или если строковый ключ не совпадает с именем любого параметра callback.

Возвращаемые значения

Возвращает результат функции или false в случае возникновения ошибки.

Список изменений

Версия Описание
8.0.0 Ключи параметра args теперь интерпретируются как имена параметров, а не игнорируются.

Примеры

Пример #1 Пример использования функции call_user_func_array()

<?php
function foobar($arg, $arg2) {
echo
__FUNCTION__, " got $arg and $arg2\n";
}
class
foo {
function
bar($arg, $arg2) {
echo
__METHOD__, " got $arg and $arg2\n";
}
}


// Вызываем функцию 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() c именем пространства имён

<?php

namespace Foobar;

class
Foo {
static public function
test($name) {
print
"Hello {$name}!\n";
}
}

call_user_func_array(__NAMESPACE__ .'\Foo::test', array('Hannes'));

call_user_func_array(array(__NAMESPACE__ .'\Foo', 'test'), array('Philip'));

?>

Вывод приведённого примера будет похож на:

Hello Hannes!
Hello Philip!

Пример #3 Использование лямбда-функции

<?php

$func
= function($arg1, $arg2) {
return
$arg1 * $arg2;
};

var_dump(call_user_func_array($func, array(2, 4)));

?>

Результат выполнения приведённого примера:

int(8)

Пример #4 Передача значений по ссылке

<?php

function mega(&$a){
$a = 55;
echo
"function mega \$a=$a\n";
}
$bar = 77;
call_user_func_array('mega',array(&$bar));
echo
"global \$bar=$bar\n";

?>

Результат выполнения приведённого примера:

function mega $a=55
global $bar=55

Пример #5 Пример использования call_user_func_array() с именованными аргументами

<?php
function foobar($first, $second) {
echo
__FUNCTION__, " получает $first и $second\n";
}

// Вызов функции foobar() с именованными аргументами в непозиционном порядке
call_user_func_array("foobar", array("second" => "two", "first" => "one"));

// Вызов функции foobar() с одним именованным аргументом
call_user_func_array("foobar", array("foo", "second" => "bar"));

// Неисправимая ошибка: Невозможно использовать позиционный аргумент после именованного аргумента
call_user_func_array("foobar", array("first" => "one", "bar"));

?>

Вывод приведённого примера будет похож на:

foobar получает one и two
foobar получает foo и bar

Fatal error: Uncaught Error: Cannot use positional argument after named argument

Примечания

Замечание:

Callback-функции, которые зарегистрировали функцией call_user_func() или call_user_func_array(), не вызовутся при непойманном исключении, которое выбросила предыдущая callback-функция.

Смотрите также

Добавить

Примечания пользователей 1 note

up
40
sebastian dot rapetti at tim dot it
3 years ago
Using PHP 8, call_user_func_array call callback function using named arguments if an array with keys is passed to $args parameter, if the array used has only values, arguments are passed positionally.

<?php

function test(string $param1, string $param2): void
{
echo
$param1.' '.$param2;
}

$args = ['hello', 'world'];
//hello world
call_user_func_array('test', $args);

$args = ['param2' => 'world', 'param1' => 'hello'];
//hello world
call_user_func_array('test', $args);

$args = ['unknown_param' => 'hello', 'param2' => 'world'];
//Fatal error: Uncaught Error: Unknown named parameter $unknown_param
call_user_func_array('test', $args);
?>
To Top