web-dev-qa-db-ja.com

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

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

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

141
Robert K
169
vartec

前述したように 、PHP 5.6+以降、...トークン(別名「スプラット演算子」、 variadic functions 機能性)引数の配列で関数を簡単に呼び出す:

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

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

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

// 'Hello World'

注:配列項目は、positionで引数にマッピングされますキーではなく配列。

CarlosCarucceのコメント によると、この形式の引数のアンパックは、すべての場合においてfarによる最速の方法です。いくつかの比較では、call_user_func_arrayより5倍以上高速です。

さておき

私はこれが本当に便利だと思うので(質問に直接関係していませんが): type-hint splat operator parameter 関数定義で、渡されたすべての値が特定の型と一致することを確認できます。

(これを行うことを忘れないでくださいでなければなりませんlastパラメーターを定義し、バンドルすること関数に渡されたすべてのパラメーターが配列に格納されます。)

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

<?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);
122
simonhamp

また、インスタンスメソッドを配列に適用する場合は、関数を次のように渡す必要があることに注意してください。

call_user_func_array(array($instance, "MethodName"), $myArgs);
81
Jeff Ober

完全を期すため、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 を使用し、オブジェクトを最初のパラメーターとして渡します。

10
DanMan