2011-06-22 110 views
1

我使用這段代碼,但我知道這不是很有效率。 還有另外一種方法嗎?更高效 ?更有效的方法.php

if ($val-> check($form) === true) { 
     {$data['livre'] = $val-> validate_age($form);} 

     if ($val->validate_age($form) === true) { 
      {$data['livre'] = $val->insertData($db, $form, $id);} 

      if ($val->insertData($db, $form, $id) === true) { 
       {$data['livre'] = $val->insertLanguages($db, $form, $id);} 

       if ($val->insertLanguages($db, $form, $id) === true) { 
        {$data['livre'] = $val->val($form);} 

        if ($val->val($form) === true) { 
         {$data['livre'] = $val->valexp($form);} 

         if ($val->valexp($form) === true) { 
          {$data['livre'] = $val->insertWorker($db, $form, $id);} 

          if ($val->insertWorker($db, $form, $id) === true) { 
           {$data['livre'] = $val->univAndCourse($form);} 
... 

感謝

+0

不是真的,如果這是合乎邏輯的流程,並且從性能角度來看任何*無效率*都是微不足道的。 –

+0

爲什麼你在賦值語句之外有{}? – Dogbert

+0

你的意思是? {$ data ['livre'] = $ val-> validate_age($ form);}? – user773961

回答

1

這就是exceptions是:

try { 
    $data['livre'] = $val->validate_age($form); 
    $data['livre'] = $val->insertData($db, $form, $id); 
    $data['livre'] = $val->insertLanguages($db, $form, $id); 
    $data['livre'] = $val->val($form); 
    $data['livre'] = $val->valexp($form); 
    $data['livre'] = $val->insertWorker($db, $form, $id); 
    $data['livre'] = $val->univAndCourse($form); 
} catch (Exception $e) { 
    // 
    // Do what ever necessary to process the interrupted logic. 
    // 
} 

當然,這意味着返回booleans驗證類拋exceptions的方法代替:

class Validator { 

    function validate_age($form) { 
     if (!is_numeric($form['age'])) throw new Exception('Invalid age.'); 
    } 

    // 
    // .. etc .. 
    // 
} 
0

把它包在一個函數,把所有檢查陰性,從函數返回後,如果結果是陰性。 此外,您可以使用$ val方法內的異常,因此無論何時出現錯誤,您都會中斷執行,而不檢查每個操作。

1

你可以提前退出。我不知道到底發生了什麼在你的代碼時,有一個失敗,但如果這將是一個功能..你可以做的這個代替:

if(condition1) { 

    if (condition2) { 

    return true; 

    } 

} 

return false; 

你可以這樣做:

if (!condition1) { 
    return false; 
} 

if (!condition2) { 
    return false; 
} 
return true; 

所以你基本上是先處理「別人的情況下..

除此之外..這也可能工作:

if (condition1 && condition2 && condition3 && condition4) { 
    return true; 
} 

或:

if (
    condition1 && 
    condition2 && 
    condition3 && 
    condition4 
) { 
    return true; 
} else { 
    return false; 
} 
+0

我需要檢查每個函數返回$錯誤,並停止進程。 – user773961

0

你可以檢查所有的驗證在一個外部條件,打開裏面一個數據庫事務。將所有插入內部的try和事務回滾放入catch中。

是這樣的:如果他們失敗

if ($val-> check($form) === true && $val->validate_age($form) === true && $val->val($form) === true && $val->valexp($form) === true) { 
    //begin your transaction here. Depending on your framework it could be different. 
    mysql_query('start transaction'); 
    try { 
     $val->insertData($db, $form, $id); 
     $val->insertLanguages($db, $form, $id); 
     $val->insertWorker($db, $form, $id); 

     //... blah blah blah more inserts here 

     //commit your transaction here 
     mysql_query('commit'); 
    } catch (Exception $e) { 
     //Roll back the transaction here 
     mysql_query('rollback'); 
    } 
} 

你只需要讓你的刀片拋出異常。

1

在這種非常特殊的情況下,你可能可以把它壓縮成使用and鏈接的表達式:

$val-> check($form) 
AND 
    $data['livre'] = $val-> validate_age($form) 
AND 
    $data['livre'] = $val->insertData($db, $form, $id) 
AND 
    $data['livre'] = $val->insertLanguages($db, $form, $id) 
AND 
    $data['livre'] = $val->val($form) 
AND 
    $data['livre'] = $val->valexp($form) 
AND   
    $data['livre'] = $val->insertWorker($db, $form, $id); 

這似乎很恰當的,因爲你真的雙assigments和if檢查,否則。

這是可行的,因爲and=分配算子具有更低的優先權。您的===true檢查證明是多餘的。如果你想要,你可以將整個條件鏈重新包裝爲if()謂詞。

1

它看起來像所有的函數調用的返回一個布爾。此代碼應該可以工作。如果任何調用返回false,則$ data ['livre']將爲false。

$data['livre'] = $val->check($form) && 
       $val->validate_age($form) && 
       $val->insertData($db, $form, $id) && 
       $val->insertLanguages($db, $form, $id) && 
       $val->val($form) && 
       $val->valexp($form) && 
       $val->insertWorker($db, $form, $id) && 
       $val->univAndCourse($form);