パラメータの配列を指定してコールバック関数をコールする

# call_user_func_array

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

call_user_func_array — パラメータの配列を指定してコールバック関数をコールする

### 説明

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

`args` にパラメータを指定して、 `callback` で指定したユーザー定義関数をコールします。

### パラメータ

`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() での名前空間の使用法

    <?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__, " got $first and $second\n";
    }

    // foobar() を名前付き引数を使いつつ、位置を指定せずにコールする
    call_user_func_array("foobar", array("second" => "two", "first" => "one"));

    // foobar() を名前付き引数をひとつだけ使ってコールする
    call_user_func_array("foobar", array("foo", "second" => "bar"));

    // Fatal error: Cannot use positional argument after named argument
    call_user_func_array("foobar", array("first" => "one", "bar"));

    ?>

上の例の出力は、 たとえば以下のようになります。

    foobar got one and two
    foobar got foo and bar

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

### 注意

> 注意: call_user_func() や call_user_func_array() で登録されたコールバックは、 前のコールバックからスローされた例外がキャッチされていない場合はコールされません。

### 参考

- call_user_func() - 最初の引数で指定したコールバック関数をコールする
- ReflectionFunction::invokeArgs() - 引数を指定して関数を起動する
- ReflectionMethod::invokeArgs() - 実行する

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