1

我有一种情况,我需要通过不同的方法查询 PHP 中的不同对象以查找一些数据。

这个问题更多地涉及格式化代码而不是实际的编程问题。我想做的是不使用几个if's 来收集这些数据,例如:

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

我想知道这种情况下的最佳做法是什么,如果有更好的方法使用其他程序,比如foreachor 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
  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 回答
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)。

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

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

于 2009-02-17T20:02:54.993 回答
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 回答