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

# call_user_func_array

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

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

### Описание

function 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-функция.

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

- call_user_func() - Вызывает callback-функцию
- ReflectionFunction::invokeArgs() - Вызов функции с передачей аргументов
- ReflectionMethod::invokeArgs() - Вызов метода с передачей аргументов массивом

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open