2009-02-17 48 views
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) 

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

谢谢!

回答

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 ... 
+0

抱歉,但这只是一团糟。我宁愿使用他提出的代码,为什么要使事情复杂化? – dusoft 2009-02-17 19:34:05

+0

我坚持我的版本,并使其成为一个功能。 $ dataCallback [] = array($ oneMore,'method'); $ data = get_data($ dataCallback);如果如果如果......如果你得到足够多的话会引起混淆,那么更好的方法是保持行数。 – OIS 2009-02-17 19:43:30

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的次数少(尽管它们非常便宜,所以我不担心它)。

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)。

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

会的工作,但如果你得到函数返回一个空数组或虚假或空字符串代替NULL,它会继续寻找数据...

0

我会大概组的对象索要数据到一个数组:

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

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

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