PHP有短路评估吗?

给出以下代码:

if (is_valid($string) && up_to_length($string) && file_exists($file)) { ...... } 

如果is_valid($string)返回false,那么php解释器是否仍然会检查up_to_length($string)类的条件? 如果是这样的话,为什么它不需要额外的工作呢?

是的,PHP解释器是“懒惰的”,这意味着它将尽可能less的比较评估条件。

如果你想validation,试试这个:

 function saySomething() { echo 'hi!'; return true; } if (false && saySomething()) { echo 'statement evaluated to true'; } 

一些阅读以及所有这些答案: http : //en.wikipedia.org/wiki/Short-circuit_evaluation

是的,它确实。 这是一个依靠短路评估的小技巧。 有时你可能会有一个小的if语句,你可以把它写成一个三元的,例如:

  if ($confirmed) { $answer = 'Yes'; } else { $answer = 'No'; } 

可以重写为:

  $answer = $confirmed ? 'Yes' : 'No'; 

但是如果yes块还需要运行一些函数呢?

  if ($confirmed) { do_something(); $answer = 'Yes'; } else { $answer = 'No'; } 

那么,重写为三元仍然是可能的,因为短路评估:

  $answer = $confirmed && (do_something() || true) ? 'Yes' : 'No'; 

在这种情况下,expression式(do_something()|| true)不会改变三元的整体结果,但是确保do_something()只有在$ confirm为真时才能运行。

不,现在不检查其他条件,如果第一个条件不满意。

不,不。 这永远是优化条件顺序的好地方。

我已经创build了我自己的短路评估逻辑,不幸的是它不像javascripts快速语法,但也许这是一个你可能会觉得有用的解决scheme:

 $short_circuit_isset = function($var, $default_value = NULL) { return (isset($var)) ? : $default_value; }; $return_title = $short_circuit_isset( $_GET['returntitle'], 'God'); // Should return type 'String' value 'God', if get param is not set 

我不记得我从哪里得到了下面的逻辑,但是如果你做了以下的话;

 (isset($var)) ? : $default_value; 

你可以跳过在问号之后再次写真条件variables,例如:

 (isset($super_long_var_name)) ? $super_long_var_name : $default_value; 

作为非常重要的观察 ,当以这种方式使用三元运算符时 ,您会注意到,如果进行比较,则只会传递该比较的值,因为不只有一个variables。 例如:

 $num = 1; $num2 = 2; var_dump( ($num < $num2) ? : 'oh snap' ); // outputs bool 'true' 

综上所述:

按位运算符是&和|
他们总是评估两个操作数。

逻辑运算符是AND,OR,&&和||
AND和OR总是评估两个操作数。

&&和|| 只有在需要时才评估右侧。

注意:如果你想避免懒惰的检查,并运行条件的每一个部分,在这种情况下,你需要使用逻辑与这样:

 if (condition1 & condition2) { echo "both true"; } else { echo "one or both false"; } 

例如,即使第一个函数返回false,您也需要调用两个函数。

我的select: 不要相信PHP中的短路评估…

 function saySomething() { print ('hi!'); return true; } if (1 || saySomething()) { print('statement evaluated to true'); } 

条件1 ||中的第二部分 saySomething()是不相关的,因为这将始终返回true。 不幸的是saySomething()被评估和执行。

也许我误解了短路expression式的确切逻辑,但是这看起来不像“它会做可能的最小数量的比较”

此外,如果您在比较内部进行任务,或者如果您做了一些有所作为的事情,而不仅仅是比较一些东西,那么结果可能会不同。

无论如何…要小心。