web-dev-qa-db-ja.com

PHPオプションのパラメーターを持つ関数

10個のパラメーターを受け入れることができるPHP関数を作成しましたが、必要なのは2つだけです。時々、8番目のパラメーターを定義したいのですが、8番目に達するまで、各パラメーターに空の文字列を入力したくありません。

私が持っていたアイデアの1つは、実際の関数に渡すパラメーターの配列を持つ抽象化された関数を渡すことでした。

必要なパラメーターのみを渡すことができるように、関数を設定するより良い方法はありますか?

94
user481826

関数が1つのパラメーターを取るようにします:配列。実際のパラメーターを配列の値として渡します。


編集:ペッカのコメント内のリンク ちょうどそれを要約します。

56
Matt Ball

この場合に行ったことは、配列を渡すことです。ここで、キーはパラメーター名で、値は値です。

$optional = array(
  "param" => $param1,
  "param2" => $param2
);

function func($required, $requiredTwo, $optional) {
  if(isset($optional["param2"])) {
    doWork();
  }
}
60
Rabbott

目的を達成するには、配列を使用します Rabbotが言ったように (ただし、これを過度に使用すると、文書化/保守が面倒になります)。または、従来のオプションの引数を使用します。

//My function with tons of optional params
function my_func($req_a, $req_b, $opt_a = NULL, $opt_b = NULL, $opt_c = NULL)
{
  //Do stuff
}
my_func('Hi', 'World', null, null, 'Red');

ただし、多くの場合、多くの引数を使用して関数/メソッドの記述を開始すると、多くの場合、コードの匂いであり、リファクタリング/抽象化されてよりクリーンなものになります。

//Specialization of my_func - assuming my_func itself cannot be refactored
function my_color_func($reg_a, $reg_b, $opt = 'Red')
{
  return my_func($reg_a, $reg_b, null, null, $opt);
}
my_color_func('Hi', 'World');
my_color_func('Hello', 'Universe', 'Green');
43
Kayla Rose

注:PHP 5.5以下の場合、これは古い回答です。 PHP 5.6+はデフォルト引数をサポートします

PHP 5.5以下では、次の2つの方法のいずれかを使用してこれを実現できます。

  • func_num_args()およびfunc_get_arg()関数を使用します。
  • nULL引数を使用します。

使い方

function method_1()
{
  $arg1 = (func_num_args() >= 1)? func_get_arg(0): "default_value_for_arg1";
  $arg2 = (func_num_args() >= 2)? func_get_arg(1): "default_value_for_arg2";
}

function method_2($arg1 = null, $arg2 = null)
{
  $arg1 = $arg1? $arg1: "default_value_for_arg1";
  $arg2 = $arg2? $arg2: "default_value_for_arg2";
}

クリーンでわかりやすいため、私は2番目の方法を好みますが、最初の方法が必要な場合もあります。

10
Daniel Loureiro

PHP 5.6以降では、引数リストに...トークンを含めて、関数が可変数の引数を受け入れることを示すことができます。引数は、指定された変数に配列として渡されます。例えば:

...を使用して変数の引数にアクセスする例

<?php
function sum(...$numbers) {
    $acc = 0;
    foreach ($numbers as $n) {
        $acc += $n;
    }
    return $acc;
}

echo sum(1, 2, 3, 4);
?>

上記の例は次を出力します:

10

可変長引数リストPHPドキュメンテーション

10
Mentos1386

デフォルト値をnullに設定するだけです。

<?php
function functionName($value, $value2 = null) {
// do stuff
}
9
Blake Stevenson

オブジェクトをparams-transportesとしても使用できると思います。

$myParam = new stdClass();
$myParam->optParam2 = 'something';
$myParam->optParam8 = 3;
theFunction($myParam);

function theFunction($fparam){      
  return "I got ".$fparam->optParam8." of ".$fparam->optParam2." received!";
}

もちろん、この関数で「optParam8」と「optParam2」のデフォルト値を設定する必要があります。それ以外の場合は、「Notice:Undefined property:stdClass :: $ optParam2」を取得します

関数パラメーターとして配列を使用する場合、デフォルト値を設定するこの方法が好きです:

function theFunction($fparam){
   $default = array(
      'opt1' => 'nothing',
      'opt2' => 1
   );
   if(is_array($fparam)){
      $fparam = array_merge($default, $fparam);
   }else{
      $fparam = $default;
   }
   //now, the default values are overwritten by these passed by $fparam
   return "I received ".$fparam['opt1']." and ".$fparam['opt2']."!";
}
4
psad

有効な状態のオブジェクトを作成するために2つの値のみが必要な場合は、他のオプション引数をすべて削除し、それらのセッターを提供できます(実行時に変更したくない場合を除く)。次に、必要な2つの引数を使用してオブジェクトをインスタンス化し、必要に応じてセッターを使用して他の引数を設定します。

参考文献

2
Gordon

私はこれが古い投稿であることを知っていますが、私はOPのような問題を抱えていて、これが私が思いついたものです。

渡すことができる配列の例。特定の注文が必要な場合は、これを再注文できますが、この質問に対しては、求められていることを行います。

$argument_set = array (8 => 'lots', 5 => 'of', 1 => 'data', 2 => 'here');

これは管理しやすく、読みやすく、コーディングのどこにでも気付くとすぐにデータ抽出ポイントを追加および削除でき、大規模な書き換えを回避できます。 OPの元の質問で集計するために整数キーを使用しましたが、文字列キーも同じように簡単に使用できます。実際、読みやすくするためにアドバイスします。

これを簡単に外部ファイルに貼り付けます

function unknown_number_arguments($argument_set) {

    foreach ($argument_set as $key => $value) {

        # create a switch with all the cases you need. as you loop the array 
        # keys only your submitted $keys values will be found with the switch. 
        switch ($key) {
            case 1:
                # do stuff with $value
                break;
            case 2:
                # do stuff with $value;
                break;
            case 3:
                # key 3 omitted, this wont execute 
                break;
            case 5:
                # do stuff with $value;
                break;
            case 8:
                # do stuff with $value;
                break;
            default:
                # no match from the array, do error logging?
                break;
        }
    }
return;
}

ファイルの場合、これを先頭に置きます。

$argument_set = array(); 

これらを使用して次のデータを割り当てるだけで、データの送信元に応じて番号付け/命名を使用できます。

$argument_set[1][] = $some_variable; 

そして最後に配列を渡します

unknown_number_arguments($argument_set);
2
Chris

通常、8番目の値を渡すだけの場合は、パラメーターが最初になるように並べ替えることができます。パラメーターを指定する必要があるのは、設定する最後のパラメーターまでです。

異なる値を使用している場合、2つのオプションがあります。

1つは、異なるパラメーターを取り、他のパラメーターにデフォルトを設定するラッパー関数のセットを作成することです。これは、いくつかの組み合わせのみを使用する場合に役立ちますが、すぐに非常に乱雑になります。

他のオプションは、キーがパラメーターの名前である配列を渡すことです。次に、配列にキーのある値があるかどうかを確認し、ない場合はデフォルトを使用します。しかし、繰り返しますが、これは面倒になり、多くのパラメーターがある場合、多くの余分なコードを追加する可能性があります。

0
Alan Geleynse