PHPで配列ではなく引数として配列を渡す


148

PHPには、配列を関数の引数のリストとして渡し、配列を標準的なfunc($arg1, $arg2)方法で逆参照する方法があることを覚えているようです。しかし、今私はそれを行う方法で迷っています。参照渡しの方法、着信パラメーターを「グロブ」する方法を思い出しますが、配列を引数のリストにリストから除外する方法は思い出しません。

それはと同じくらい簡単かもしれませんが、それはそうfunc(&$myArgs)ではないとかなり確信しています。しかし残念ながら、php.netのマニュアルではこれまで何も明らかにされていません。この特定の機能を昨年ほど使用しなければならなかったわけではありません。

回答:


178

1
これもまた、プレフィックス文字などの非機能であると断言できました。ありがとう。
Robert K

8
しかし、私はPythonを知りません!私は誤って超能力者である必要があります...:D
ロバートK

45
引数のアンパッキングは、呼ばれるように、PHP 5.6(wiki.php.net/rfc/argument_unpacking)で追加されます。'splat operator': '...'を使用します。その構文: $args = [1,2,3]; function(...$args){}
arothuis

4
しかし、呼び出したい関数がグローバルスペースの関数名ではなく、オブジェクトのインスタンスメソッドである場合はどうでしょうか。
ahnbizcad 2015年

6
@ahnbizcadの場合callable、同じを使用するを使用する必要call_user_func_arrayがあります。最初の要素がオブジェクトで、2番目がメソッドである配列でのみ使用します。たとえばcall_user_func_array([$object, 'method'], $myArgs);
SteveB

149

すでに述べたように、PHP 5.6以降では、...トークン(別名「スプラットオペレーター」、可変関数の機能の一部)を使用して、引数の配列で関数を簡単に呼び出すことができます(推奨!)。

<?php
function variadic($arg1, $arg2)
{
    // Do stuff
    echo $arg1.' '.$arg2;
}

$array = ['Hello', 'World'];

// 'Splat' the $array in the function call
variadic(...$array);

// 'Hello World'

注:配列項目は 、キーではなく配列内の位置 によって引数にマップされます。

あたりとしてCarlosCarucceさんのコメント、引数開梱のこの形式は、はるかに最速の方法ですべてのケースでは。一部の比較では、の5倍以上高速ですcall_user_func_array

さておき

これは本当に便利だと思うので(質問とは直接関係はありませんが)、関数定義のsplat演算子パラメータータイプヒントして、渡されたすべての値が特定の型と一致することを確認できます。

(これを行うのは、定義する最後のパラメーターでなければならず、関数に渡されるすべてのパラメーターを配列にバンドルすることを忘れないでください。)

これは、配列に特定のタイプのアイテムが含まれていることを確認するのに最適です。

<?php

// Define the function...

function variadic($var, SomeClass ...$items)
{
    // $items will be an array of objects of type `SomeClass`
}

// Then you can call...

variadic('Hello', new SomeClass, new SomeClass);

// or even splat both ways

$items = [
    new SomeClass,
    new SomeClass,
];

variadic('Hello', ...$items);

7
これにより、に比べてパフォーマンスが大幅に向上しcall_user_func_arrayます。したがって、php 5.6以降を使用している場合は、これをお勧めします。これは公式のphp wikiで
CarlosCarucce

2
残念ながら、これはマークされた答えではありません。間違いなくより良い
unforgiven1987

81

また、インスタンスメソッドを配列に適用する場合は、関数を次のように渡す必要があります。

call_user_func_array(array($instance, "MethodName"), $myArgs);

4
@understack リンクされたページ$foo->bar()例は、そうあるべきだと示唆しています。array($instance, "MethodName")
Paul Calcraft、2011年

11
すばらしいです。これを使用して、子クラスでコンストラクター引数が重複しないようにしました:)call_user_func_array(array(parent, "__construct"), func_get_args());
Jason

10

完全を期すために、PHP 5.1以降ではこれも機能します。

<?php
function title($title, $name) {
    return sprintf("%s. %s\r\n", $title, $name);
}
$function = new ReflectionFunction('title');
$myArray = array('Dr', 'Phil');
echo $function->invokeArgs($myArray);  // prints "Dr. Phil"
?>

参照:http : //php.net/reflectionfunction.invokeargs

メソッドの場合は、代わりにReflectionMethod :: invokeArgsを使用して、オブジェクトを最初のパラメーターとして渡します。


これは実際に私が探していたものです!
Dejv 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.