2

いくつかのオブジェクトがあると仮定します

$a = new stdClass;
$a->b = 7;
$a->c = 'o';
$a->d = array(1,2,3);

また、オブジェクトのいくつかのプロパティ (たとえばbと) で何かを行う関数もありますd[1]

私の質問:私の関数はオブジェクト全体を次のようなパラメータとして受け入れる必要があります:

function some($a) {
 var_dump($a->b);
 var_dump($a->d[1]);
}

some($a);

または、次のように処理する特定のフィールドのみを受け入れます。

function some($b, $d) {
 var_dump($b);
 var_dump($d);
}

some($a->b, $a->d[1]);

実際には$aオブジェクトでも配列でも構いません。

4

3 に答える 3

8

オブジェクトはデフォルトで参照によって渡されることに注意してください。したがって、オブジェクト全体を渡す場合、必要に応じて関数自体からオブジェクトの値を変更できます。

例のように一部のプロパティのみを値で渡す場合、オブジェクトのプロパティを変更する必要がある場合は、何かを返し、それを外部からオブジェクトに適用する必要があります。もちろん、いつでもプロパティ自体を参照として渡すことができます。

とにかく、最初のアプローチ (オブジェクト全体を渡す) を使用します。これは、後でプロパティを追加する必要がある場合に読みやすく、拡張しやすいためです。必要な各プロパティの値ではなく、オブジェクトへのポインタのみがコピーされるため、メモリへの影響は最小限です。

于 2012-05-06T06:30:50.840 に答える
5

私は最初の選択肢が進むべき道だと信じています。

function some($a) {
 var_dump($a->b);
 var_dump($a->d[1]);
}

some($a);

時間の経過とともに、そのオブジェクト/配列の他の部分が必要になり、関数とそれらを実行する呼び出しを変更する必要があるためです。したがってfunction some()、グローバル関数にすることができ、他の方法で使用することができます。後でステートメントを追加したり、どこでも変更することなく関数を変更したりできます。

function some($a, $param1 = 1){
    if($param1 == 1){
        var_dump($a->c);
        var_dump($a->d[2]);
    } else {
        var_dump($a->b);
        var_dump($a->d[1]);
    }
}
于 2012-05-06T06:21:15.003 に答える
3

通常、私たちはオブジェクト プロパティと関数の両方の有用性を過小評価するため、私は Mihai に同意する傾向がありますが、本当に洗練されたコードが必要な場合は、関数パラメーターは関数の目的 (および全体的なデータ モデル) を反映する必要があります。そうは言っても、関数をオブジェクト自体のメソッドにするのは良い議論ですが、それがユーティリティ関数であると仮定すると:

  function find_median($low, $high) {

     return ($low + $high)/2;

  }

そして、私たちのオブジェクトは UserStats と呼ばれ、さまざまな領域でそのユーザーの統計のいくつかの配列を保持しています。オブジェクト全体(または特定の統計グループの配列全体)を渡すことは、犯罪や子犬の殺害にはなりませんが、怠惰であり、最終的に単純な関数が肥大化した計算機になることにつながると思います。 「まあ、それはすでにすべてのデータを持っています。ここですべてを行うこともできます!」

これはすべて、実際のモデルとワークフローを可能な限りエレガントに、シンプルに、巧みに反映する必要があるという、コーディングに関する私の見解です。これを効率とパフォーマンスに合わせようとしますが、最終的には、ストーリーを伝え、マップを描画し、実際に何が起こっているかを示すコードが必要です。必要なものを取得します。

そうは言っても、電卓などが必要になるかもしれません。ミハルが言ったように、必要なデータだけを持っているよりも、値を必要としているのにそれを持っていない方がはるかに一般的です。

于 2012-05-06T06:40:12.983 に答える