2014-10-08 90 views
-1

我會盡量保持這個簡單。我做了測試一些TWP功能:哪種方式更有效率?

//user valid 
function validusr(){ 
    return true;//or false, depends 
} 
//user in db 
function indbusr(){ 
    return true;//or false, depends 
} 

後來,我有這個

if (!validusr($myval)) return validusr($myval);  
    else if (!indbusr($myval)) return indbusr($myval);    
     else return true; 

然而,這似乎不太好是因爲我調用函數2次:第一次測試$myval,以及一次當我返回它。但是,如果我說,存儲這樣的值:

$result1=validusr($myval); 
$result2=indbusr($myval); 

     if (!$result1) return $result1;  
     else if (!$result2) return $result2;   
      else return true; 

可能有情況下,當第二個語句從未運行,因爲第一個將永遠是真實的,這使得調用第二功能形同虛設。

那麼,哪一個更有效?存儲該值並冒其不被使用的風險,或僅在需要時調用該函數兩次?

+0

所以你必須對大括號的東西嗎? – 2014-10-08 22:04:10

+1

你可以計算只是在'else'子句中的第二個值... – Sirko 2014-10-08 22:04:18

+0

@Sirko爲什麼我沒有想到的是......謝謝。 – 2014-10-08 22:05:09

回答

6

你的邏輯歸結爲:

If the user is valid AND in the database, return true, otherwise, return false; 

您可以利用PHP的內部優化器,以確定調用哪個函數。使用這個:

return (validusr($myval) && indbusr($myval)); 

PHP將執行第一個函數並展望表達式。如果函數返回true它將繼續下一個函數。如果返回false表達將false無論未來函數返回所以PHP不會理會調用它並立即返回false

同樣,只要遇到序列中的true值,PHP將通過返回true來優化OR表達式($a || $b ||someFunction($c))。 (感謝dognose爲突出這一點!)

這是偉大的,如果你的函數沒有副作用。如果除了回答真實/錯誤問題之外,您還依賴第二個函數來獲得其他效果,這對您而言不起作用。

你可以看到它的工作here - 嘗試改變的函數的返回值,看看當你運行它會發生什麼。

+0

也許值得一提* skip on first false *是for-case('true &&''') - 如果你有ors('||')php會在第一個'true'時跳過剩餘條件。 (因爲'true || ???'已經是'true') – dognose 2014-10-08 22:37:36