407


実行時に、関数からその関数を実行せずに必要な引数の数を知るにはどうすれば良いですか?

[code]

    <?php
    
    function myFunc($a, $b, $c)
    {
        return "$a, $b and $c!";
    }
    
[/code]

このような関数を定義したとき、`$a, $b, $c` という三つの引数を必要とするので「3」という数が知りたいです。

また、メソッドについても同じように調べられますか?

[code]

    <?php
    
    class Hoge
    {
        public static function fuga ($a, $b)
        {
            return "fuga: $a and $b!";
        }
    
        public function piyo ($a, $b, $c)
        {
            return "piyo: $a, $b and $c!";
        }
    }
    
[/code]


CC BY-SA 3.0
2014-12-06T18:35:21.523
406
2014-12-11T02:55:33.667
938
question
php
関数やメソッドの引数の数を調べるにはどうすればいい？


PHPの実行時にクラスや函数などの詳細な情報を取得するには[リフレクション](http://php.net/manual/book.reflection.php)といふ仕組を利用します。

今回のように函数の情報を知りたいときには、[ReflectionFunction](http://php.net/manual/class.reflectionfunction.php)を利用することができます。

[code]

    <?php
    
    $func_ref = new ReflectionFunction("myFunc");
    echo $func_ref->getNumberOfParameters() . PHP_EOL;
    // 3
    
[/code]

この仕組は、もちろんPHPの標準函数に対しても、[無名関数](http://php.net/manual/functions.anonymous.php)に対しても利用することができます。

メソッドは方法が少し違って、[ReflectionClass](http://php.net/manual/class.reflectionclass.php)から[ReflectionMethod](http://php.net/manual/class.reflectionmethod.php)を取得します。

[code]

    <?php
    
    $c = new ReflectionClass("Hoge");
    echo $c->getMethod("fuga")->getNumberOfParameters() . PHP_EOL;
    // 2
    echo $c->getMethod("piyo")->getNumberOfParameters() . PHP_EOL;
    // 3
    
    $d = new ReflectionClass(new Hoge);
    echo $d->getMethod("fuga")->getNumberOfParameters() . PHP_EOL;
    // 2
    echo $d->getMethod("piyo")->getNumberOfParameters() . PHP_EOL;
    // 3
    
[/code]

`new ReflectionClass` はクラス名を渡す方法とインスタンスを渡す方法のどちらでも大丈夫です。

詳細については[PHP - 函数・クロージャの引数の個数を調べる -
Qiita](http://qiita.com/tadsan/items/b539eab11fb6902c17f1)も併せて読んでください。


CC BY-SA 3.0
2014-12-06T18:35:21.523
407
2014-12-06T18:35:21.523
938
406
answer


リフレクションを使わなくても引数を動的に扱える関数があります。

<http://php.net/manual/ja/function.func-get-args.php>

配列で引数が取得できるので数えれば個数も分かりますし、好きな順番で扱うこともできます。
動的な処理を行うライブラリやフレームワーク的な実装をする際に昔から疲れている関数です。


CC BY-SA 3.0
2014-12-11T02:55:33.667
497
2014-12-11T02:55:33.667
452
406
answer