我有一种情况,我需要通过不同的方法在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
。
谢谢!
答案 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)
如果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));