2014-10-08 67 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