0

関数を呼び出すとき、引数リストを単純化する方法はありますか? を使用する代わりに$blank

$subscribe=1;
    $database->information($blank,$blank,$blank,$blank,$blank,$blank,$subscribe,$blank,$blank,$blank,$blank,$blank);



    function information ($search,$id,$blank,$category,$recent,$comment,$subscribe,$pages,$pending,$profile,$deleted,$reported) {
    //code
    }
4

6 に答える 6

2

はい、代わりに配列を渡すか、リファクタリングします。長い引数リストは通常​​悪臭です。

function information(array $params) {....

information(array('search'=>'.....
于 2012-04-11T09:57:44.650 に答える
2

通常、12個の引数は1つの関数には多すぎます。function informationモンスターのように見えるリファクタリングによって、コードが単純化される可能性があります(引数リストが短くなることを含む) 。

その間に使用できる一時的な対策は次のとおりです。

  • デフォルトの引数値の追加
  • 関数にすべての引数を配列として受け入れさせる

上記の両方で、レビューと変更のために機能のすべての呼び出しサイトにアクセスする必要があります。

デフォルトの引数を追加することは、ここでは不適切な選択です。呼び出し例を見ると、すべての引数をデフォルトにする必要があるようです。つまり、関数を誤って誤って呼び出した場合でも、コンパイラは警告を表示しません。

配列への変換はより手間がかかりますが、偶発的なエラーの影響を受けにくい方法で呼び出しを書き直す必要があります。関数のシグネチャは次のように変更されます

function information(array $params)

またはおそらく

function information(array $params = array())

すべてのパラメーターをオプションにする場合。パラメータのデフォルトを次のように指定できます

function information(array $params) {
    $defaults = array('foo' => 'bar', /* ... */);
    $params += $defaults; // adds missing values that have defaults to $params;
                          // does not overwrite existing values

関数本体を書き直さなくても済むように、を使用exportしてこれらの値を配列からローカルスコープに引き出すことができます。

    export($params); // creates local vars
    echo $foo; // will print "bar" unless you have given another value

このすべての動作を参照してください

于 2012-04-11T09:58:13.617 に答える
2

指定されたキーを持つ配列を渡し、それをデフォルト値の配列とマージすることができます

だから代わりに

function foo($arg1 = 3, $arg2 = 5, $arg3 = 7) { }

あなたが持っているだろう

function foo($args) {
   $defaults = array(
      'arg1' => '',
      'arg2' => null,
      'arg3' => 7
   );

   // merge passed in array with defaults
   $args = array_merge($defaults, $args);

   // set variables within local scope
   foreach($args as $key => $arg) { 
       // this is to make sure that only intended arguments are passed
       if(isset($defaults[$key])) ${$key} = $arg; 
   }

    // rest of your code
}

次に、次のように呼び出します

foo(array('arg3' => 2));
于 2012-04-11T09:59:15.643 に答える
0

関数が変数に空の文字列のような指定された値を自動的に入力するようにすることができます。

function information ($subscribe, $search="", $id="", $blank="", $category="", $recent="", $comment="", $pages="", $pending="", $profile="", $deleted="", $reported="") {
    //code
}
于 2012-04-11T09:58:01.960 に答える
0

いくつかの方法:

function test($input = "some default value") {
    return $input; // returns "some default value"
}

function test($input) {
    return $input;
}

test(NULL); // returns NULL

function test() {
   foreach(func_get_args() as $arg) {
       echo $arg;
   }
}

test("one", "two", "three"); // echos: onetwothree
于 2012-04-11T10:00:49.917 に答える
0

はい、いくつかの方法があります。

  • 連想配列を単一の引数として受け入れ、必要なものをそれに渡します。重要な引数が欠落している場合、例外をスローします。
  • 重要な引数は関数定義の先頭に置き、オプションの引数は最後に置きます。それらを宣言する必要がないように、それらにデフォルト値を与えます。
  • あなたの機能を再考してください。1 つの関数に対して 12 個の引数は多すぎます。クラス/オブジェクトを使用するか、異なる機能間で作業を分割することを検討してください。
于 2012-04-11T10:00:10.700 に答える