2009-09-14 53 views
93

可変数の引数(func_num_args()func_get_args()を使用)を使用するPHP関数がありますが、関数を渡す引数の数は、関数の長さによって異なります。アレイ。 への道はありますか?さまざまな引数を持つPHP関数を呼び出しますか?PHP関数に可変数の引数を渡す方法

+1

新しいphp5.6でスプラットオペレータについて学ぶために私の答えをチェックしてください:http://stackoverflow.com/a/23163963/1090562 –

答えて

108

引数を配列に持つ場合は、call_user_func_array関数を使用します。

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

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


あなたはこの機能を持っている場合、:

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

そして、それから、関数を呼び出す:

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

をあなたはこのように、配列の中にあなたのパラメータをパックすることができます

call_user_func_array('test', $params); 

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

int 3 

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

つまり3つのパラメータ。関数がこのように呼び出されたのとまったく同じです。

test(10, 'glop', 'test'); 
+1

はい、ありがとうございます。 call_user_func_array()は、私が探していた関数です。 – nohat

+0

オブジェクトメソッド呼び出しでcall_user_func_array()を使用できますか? – nohat

+6

@nohat:歓迎します:-) ;;オブジェクトのメソッドを使うことについて:はい、最初のパラメータとしてarray($ obj、 'methodName')のようなものを使用できます。実際には、その関数に必要な "コールバック"を渡すことができます。コールバックの詳細については、http://php.net/callback#language.types.callbackを参照してください。 –

5

これを呼び出すことができます。

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

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

出力:

アレイ([0] =>何とか)アレイ([0] =>何とか[1] =>何とか)これを行う方法をお探しの方に

+0

OPが正しく理解されていれば、問題はパラメータを受け取っていませんが、**可変番号パラメータの –

+1

私は正しくOPを理解していませんでした。配列は確かに行く方法だろう。次に、彼は配列をtest()に直接渡すことができますか? –

+1

配列を渡すことも解決策になるかもしれません - 私が正しく理解していれば^^ –

9

$object->methodで:

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

私は、変数パラメータと変数METHOD_NAMEを呼び出す構文機能でこれに成功しました。

41

これは(もいくつかの言語でのスプラット事業者として知られている)...演算子を使用して、今possible with PHP 5.6.xです:

例:ここでは

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')); 
1

__invokeマジックメソッドを使用してソリューションです

(php5以降で利用可能です。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']) 
32

新しいPhp 5.6で、あなたの代わりにfunc_get_args()を使用しての... operatorを使用することができます。

function manyVars(...$params) { 
    var_dump($params); 
} 
+3

詳細情報:http://php.net/manual/en/migration56.new-features.php#migration56.new-features.variadics – fracz

+0

@fraczリンクから、OPは「バリデーション機能」を作成しようとしています。 –

2

古い質問は、私が知っている、しかし、ここでの回答のどれもが本当に単に質問に答えるのは良い仕事をしません:

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

私はPHPで遊んとソリューションは次のようになります。

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

この関数は二つのことを行うことができます。そののみ必要なパラメータで呼ばれた場合

を:myFunction("Hi") それは "印刷しますこんにちはデフォルト "

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

これは、この道を探している人に役立つことを願っています。

20

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以来、引数の変数リストは、あまりにも同じタイプのすべてのことを強制することができます。

function do_something($first, int ...$all_the_others) { /**/ } 
+1

これは受け入れられる回答である必要があります。 –

2

は、私は驚い誰もがここで簡単に渡すと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

関連する問題