切换单个结果的方法

时间:2009-02-17 18:46:37

标签: php code-formatting

我有一种情况,我需要通过不同的方法在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)

我想知道在这种情况下最佳做法是什么,如果有更好的方式使用其他程序,例如foreachswitch/case

谢谢!

5 个答案:

答案 0 :(得分: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 ...

答案 1 :(得分:0)

  1. 它看起来并不太糟糕。
  2. 如果if是嵌套的话可能会更有效率。 e.g。

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

    由于对isset的调用较少(尽管它们相当便宜,所以我不担心)。

答案 2 :(得分: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语句是合适的。开关倾向于测试一个变量的值($ a = 1,2,3或4)。

答案 3 :(得分:0)

($data = $ob1->get()) || ($data = $ob2->get()) || ($data = $ob3->get());

会工作,但如果你得到函数返回一个空数组或false或空字符串而不是NULL,它将继续寻找数据......

答案 4 :(得分:0)

我可能会将对象分组以将数据请求到数组中:

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

然后运行while循环直到我有数据:

$i = 0;
do {
   $data = $objArray[$i]->getData();
   $i++;
} while(!isset($data) && $i < count($objArray));