2011-03-11 34 views
18

PHPにfunc_get_argという機能があり、開発者が引数を取得するためのバリアントスタイルを使用できることが分かりました。 引数の数は今や任意である可能性があるので非常に便利だと思われますが、それを使う良い例は考えられません。PHPで 'func_get_arg'を使用する良い例は何ですか?

この機能を使用してその多型特性を十分に活用する例は何ですか?

+0

http://us2.php.net/manual/en/function.func-get-arg.php「Examples」までスクロールして、「User Contributed Notes」を読んでください。 – drudge

+0

sprintf'と 'max'は良いです任意の数の引数を扱うことができる関数の例通常、一様に型指定されたパラメーターで使用します。 – mario

+4

あなたは '多形性'を意味するものではありません:あなたが探している用語は 'バリエディック'です:http://en.wikipedia.org/wiki/Variadic_function –

答えて

22

私は通常、複数の引数が必要な場合に使いやすいfunc_get_args()を使用します。

例えば、PHPのmax()を再作成する。

function max() { 
    $max = -PHP_INT_MAX; 
    foreach(func_get_args() as $arg) { 
     if ($arg > $max) { 
      $max = $arg; 
     } 
    } 
    return $max; 
} 

CodePad

echo max(1,5,7,3)となり、7となります。

+4

あなたが知っている、それは 'array_reduce(func_get_args()、 'max')'にまで下がり、負の数でも動作します。 –

+0

@Keithおそらく、私はその最初の数字を '-PHP_INT_MAX'にしていたはずです。 – alex

+1

それだけで問題があるのは、引数を与えなければ、答えは '-PHP_INT_MAX'です。 'array_reduce($ a、 'max')'は空の配列であっても動作します。この場合、 'null'が返されます。私たちはここで話題に少しだけ耳を傾けています。:-) –

1

私はほとんどfunc_get_arg()を使用していませんが、私はそのいとこfunc_get_args()をかなり使います。ここでは一例として、エンティティはすべての引数を符号化しecho文のラインに沿った機能です:

function ee() { 
    $args = func_get_args(); 
    echo implode('', array_map('htmlentities', $args)); 
} 

私はその機能にかなりを使用しています。

これは、SQLのCOALESCE()機能と同じジョブを実行する別の便利な例です。

function coalesce() { 
    $args = func_get_args(); 
    foreach ($args as $arg) { 
     if (!is_null($arg)) { 
      return $arg; 
     } 
    } 
    return null; 
} 

はそのような引数がない場合には、最初の非ヌルで渡される引数、またはnullを返します。

+2

[その最初の引数](http://codepad.org/Gil0Xi29)を 'implode()'に削除できます。 – alex

+3

習慣の力 - 私はPHP 4.0が登場した直後からPHPでコードを書いてきました。 –

1

個人的には、通常の機能の中には良いユースケースがあるとは思いません。コントロールフリークとして、私は自分の機能に何が渡されているのか正確に知りたいと思っています。私が何をすべきかを正確に知りたいのです。

ただし、動的/静的URLルーティングなどの機能をフルに使用できます。あなたが(mod_rewriteを介して)書き換えているとき、URL引数は単一のブートストラップにargsします。

この意味で、すべてのページリクエストに必ずしも存在する必要はない引数を持つことができます。

2

まず、「多型」という用語は完全に間違っています。多態性は、オブジェクト指向プログラミングの概念であり、関数内の可変引数の数とは何の関係もありません。

私の経験では、すべてfunc_get_argsは、少し構文的な砂糖を追加することができます。

任意の数の整数をとり、その合計を返す関数を考えてみましょう。 (これは既にarray_sumに存在するので、私は浮気していますが、例を単純にしておくと不正行為は良いです)。あなたはそれをこのように行うことができます:

// you can leave "array" out; I have it because we should be getting one here 
function sum1(array $integers) { 
    return array_sum($integers); 
} 

を今、あなたはそうのようにこれを呼び出します。

$sum = sum1(array(1)); 
$sum = sum1(array(1, 2, 3, 4)); 

は、これは非常にきれいではありません。しかし、我々はより良​​い操作を行うことができます。

function sum2() { 
    $integers = func_get_args(); 
    return array_sum($integers); 
} 

今、あなたはこのようにそれを呼び出すことができます。

$sum = sum2(1); 
$sum = sum2(1, 2, 3, 4); 
2

のは、我々は合併せずにそれらの値のためのキー全体に検索する必要のあるデータを含む複数のアレイを持っているとしましょうこれらの配列。その場合

$a = array('a' => 5, 'b' => 6); 
$b = array('a' => 2, 'b' => 8); 
$c = array('a' => 7, 'b' => 3); 

、我々はすべてのアレイからのキーaのすべての値を取得する必要が言う:

配列が似ています。私たちは、に検索するための配列の任意の数に取る関数を書くことができます

// we need the key, and at least 1 array to search in 
function simpleSearchArrays($key, $a1){ 
    $arrays = func_get_args(); 
    array_shift($arrays); // remove the first argument, which is the key 
    $ret = array(); 
    foreach($arrays as $a){ 
     if(array_key_exists($key, $a)){ 
      $ret[] = $a[$key]; 
     } 
    } 
    return $ret; 
} 

我々は機能を使用する場合そう:。

$x = simpleSearchArrays('a', $a, $b, $c); 

$xを、その後array(5, 2, 7)が含まれています。

0

公式ドキュメントを参照してください。func_get_args()
関数の引数リストの配列を取得します。

この関数をfunc_get_arg()およびfunc_num_args()と組み合わせて使用​​すると、ユーザー定義関数で可変長引数リストを受け入れることができます。

<?php 
     function foo() 
     { 
      $numargs = func_num_args(); 
      echo "Number of arguments: $numargs \n"; 
      if ($numargs >= 2) { 
       echo "Second argument is: " . func_get_arg(1) . "\n"; 
      } 
      $arg_list = func_get_args(); 
      for ($i = 0; $i < $numargs; $i++) { 
       echo "Argument $i is: " . $arg_list[$i] . "\n"; 
      } 
     } 

     foo(1, 2, 3); 
?> 
0

php5.6からは、もはやfunc_get_argの使用例はありません。これは、その機能がもはや必要ないと言っているわけではないが、...構文を使用してvariadic functionに置き換えます。

/** 
* @param array $arguments 
*/ 
public function poit(...$arguments) 
{ 
    foreach($arguments as $argument) { 
     ... 
    } 
} 

最後にオーバーロードされている方法がある場合、これは特に便利です。 an exampleで展示ように、1つは、もはや最初の引数をフィルタリングする必要がない:

func_get_argを使用して

古いスタイル:

function foo($a, $b) { 
    $c = array(); 
    if (func_num_args() > 2) { 
     for($i = 0; $i < func_num_args()-2; $i++) { 
      $c[] = func_get_arg($i+2); 
     } 
    } 
    var_dump($a, $b, $c) 
    // Do something 
} 
foo('a', 'b', 'c', 'd'); 

可変引数スタイルを新しいです。

function foo($a, $b, …$c) { 
    var_dump($a, $b, $c); 
    // Do something 
} 
foo('a', 'b', 'c', 'd'); 

fooはどちらも同じ出力を生成しますが、どちらかというとはるかに簡単です。