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式的确切逻辑,但是这看起来不像“它会做可能的最小数量的比较” 。
此外,如果您在比较内部进行任务,或者如果您做了一些有所作为的事情,而不仅仅是比较一些东西,那么结果可能会不同。
无论如何…要小心。