1

データを見つけるために、さまざまな方法で PHP のさまざまなオブジェクトを参照する必要がある状況があります。

この質問は、実際のプログラミングの問題よりもコードのフォーマットに関するものです。私がやろうとしているのは、if次のようなデータを収集するために複数のを使用しないことです。

$data = obj->getData();
if (!isset($data)) $data = othObj->getThisData();
if (!isset($data)) $data = anothObj->getTheData();
if (!isset($data)) $data = anothOne->getAData();
...
process($data)

foreachまたはのような別の手順を使用するより良い方法がある場合、この場合のベストプラクティスは何ですかswitch/case.

ありがとう!

4

5 に答える 5

2

試してみたいオブジェクトの配列を作成してから、ループを実行できます。メンテしやすいかも。このコードを変更してパラメーターを含め、代わりに call_user_func_array を使用することができます。

$dataCallback = array(
    array($othObj, 'getData'),
    array($othObj, 'getThisData'),
    array($anothObj, 'getTheData'),
    array($anothOne, 'getAData'),
);

for($i = 0, $t = count($dataCallback); !isset($data) && $i < $t; $i++) {
  $callback = $dataCallback[$i];
  $data = call_user_func($callback);
}

if (isset($data))
  process($data);
else
  //no valid data returned at all ...
于 2009-02-17T19:15:38.727 に答える
0

おそらくオブジェクトをグループ化して、データを配列に要求します。

$objArray = array($obj, $othObj, $anothObj, ... );

次に、データが得られるまで while ループを実行します。

$i = 0;
do {
   $data = $objArray[$i]->getData();
   $i++;
} while(!isset($data) && $i < count($objArray));
于 2009-02-21T03:58:11.350 に答える
0

個人的には、次のようにします。

$data = null;

if (isset($obj->getData()) $data = $obj->getData();
else if (isset($othObj->getThisData()) $data = $othObj->getThisData();
else if (isset($anothObj->getTheData()) $data = $anothObj->getTheData();
else if (isset($anothOne->getAData()) $data = $anothOne->getAData();

process($data)

これにより、以前のオブジェクトが実際に何かを返す場合、処理時間が節約されます。データが見つかると、elseif セットアップであるため、他の if 句の処理を停止します。

この場合、switch ステートメントは適切ではないと思います。スイッチは、1 つの変数 ($a = 1、2、3、または 4) の値をテストする傾向があります。

于 2009-02-17T19:01:11.897 に答える
0
($data = $ob1->get()) || ($data = $ob2->get()) || ($data = $ob3->get());

動作しますが、関数がNULLではなく空の配列またはfalseまたは空の文字列を返す場合、データを探し続けます...

于 2009-02-17T20:02:54.993 に答える
0
  1. このままでも見た目は悪くありません。
  2. if がネストされていれば、もう少し効率的です。例えば

     if (!isset($data = othObj->getData()))
     if (!isset($data = othObj->getThisData()))
     if (!isset($data = anothObj->getTheData()))
     $data = anothOne->getAData()))
     // ...
     process($data)
    

    isset の呼び出しが少ないため (とにかくかなり安価なので、心配する必要はありません)。

于 2009-02-17T18:56:22.983 に答える