web-dev-qa-db-ja.com

可変数の引数をPHP関数に渡す方法

可変数の引数をとるPHP関数(func_num_args()およびfunc_get_args()を使用)がありますが、関数に渡す引数の数は、アレイ。 call可変数の引数を持つPHP関数への方法はありますか?

110
nohat

配列に引数がある場合、 call_user_func_array 関数に興味があるかもしれません。

渡す引数の数が配列の長さに依存している場合、おそらく配列自体にそれらをパックできることを意味し、call_user_func_arrayの2番目のパラメーターにその引数を使用します。

渡された配列の要素は、関数によって個別のパラメーターとして受け取られます。


たとえば、この関数がある場合:

function test() {
  var_dump(func_num_args());
  var_dump(func_get_args());
}

次のように、パラメーターを配列にパックできます。

$params = array(
  10,
  'glop',
  'test',
);

そして、関数を呼び出します:

call_user_func_array('test', $params);

このコードは出力されます:

int 3

array
  0 => int 10
  1 => string 'glop' (length=4)
  2 => string 'test' (length=4)

すなわち、3つのパラメータ。 iofとまったく同じように、関数は次のように呼び出されました。

test(10, 'glop', 'test');
124
Pascal MARTIN

これは PHP 5.6.xで可能 で、...演算子(一部の言語ではsplat演算子とも呼ばれます)を使用しています:

例:

function addDateIntervalsToDateTime( DateTime $dt, DateInterval ...$intervals )
{
    foreach ( $intervals as $interval ) {
        $dt->add( $interval );
    }
    return $dt;
}

addDateIntervaslToDateTime( new DateTime, new DateInterval( 'P1D' ), 
        new DateInterval( 'P4D' ), new DateInterval( 'P10D' ) );
56
JCM

新しいPhp 5.6では、func_get_args()を使用する代わりに... operatorを使用できます。

したがって、これを使用して、渡すすべてのパラメーターを取得できます。

function manyVars(...$params) {
   var_dump($params);
}
44
Salvador Dali

PHP 5.6なので、可変引数リストは...演算子で指定できます。

function do_something($first, ...$all_the_others)
{
    var_dump($first);
    var_dump($all_the_others);
}

do_something('this goes in first', 2, 3, 4, 5);

#> string(18) "this goes in first"
#>
#> array(4) {
#>   [0]=>
#>   int(2)
#>   [1]=>
#>   int(3)
#>   [2]=>
#>   int(4)
#>   [3]=>
#>   int(5)
#> }

ご覧のとおり、...演算子は、配列内の引数の変数リストを収集します。

変数の引数を別の関数に渡す必要がある場合でも、...が役立ちます。

function do_something($first, ...$all_the_others)
{
    do_something_else($first, ...$all_the_others);
    // Which is translated to:
    // do_something_else('this goes in first', 2, 3, 4, 5);
}

PHP 7であるため、引数の変数リストは、同じタイプのallにすることもできます。

function do_something($first, int ...$all_the_others) { /**/ }
37
Daniele Orlando

$object->methodでこれを行う方法を探している人向け:

call_user_func_array(array($object, 'method_name'), $array);

変数methodを使用して変数method_nameを呼び出すコンストラクト関数でこれに成功しました。

10
danilo

あなたはそれを呼ぶことができます。

function test(){        
     print_r(func_get_args());
}

test("blah");
test("blah","blah");

出力:

配列([0] => blah)配列([0] => blah [1] => blah)

4
Donnie C

ここで誰も単純に配列を渡して extract ingに言及していないことに驚いています。例えば:

function add($arr){
    extract($arr, EXTR_REFS);
    return $one+$two;
}
$one = 1;
$two = 2;
echo add(compact('one', 'two')); // 3

もちろん、これは argument validation を提供しません。そのために、誰でも私の期待関数を使用できます: https://Gist.github.com/iautomation/8063fc78e9508ed427d5

2
iautomation

古い質問ですが、ここでの答えはどれも、単に質問に答えるだけの良い仕事をしていません。

私はちょうどphpをいじってみましたが、解決策は次のようになります。

function myFunction($requiredArgument, $optionalArgument = "default"){
   echo $requiredArgument . $optionalArgument;
}

この関数は2つのことを実行できます。

必須パラメーターのみで呼び出された場合:myFunction("Hi")「Hi default」を出力します

しかし、オプションのパラメーターで呼び出された場合:myFunction("Hi","me")「Hi me」と出力されます。

これが将来これを探している人の助けになることを願っています。

1
Alex

以下は、マジックメソッド__invokeを使用したソリューションです。

(PHP 5.3以降で使用可能)

class Foo {
    public function __invoke($method=null, $args=[]){
        if($method){
            return call_user_func_array([$this, $method], $args);
        }
        return false;
    }

    public function methodName($arg1, $arg2, $arg3){

    }
}

同じクラス内から:

$this('methodName', ['arg1', 'arg2', 'arg3']);

オブジェクトのインスタンスから:

$obj = new Foo;
$obj('methodName', ['arg1', 'arg2', 'arg3'])
0
Dieter Gribnitz