2009-02-17 45 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));