PHP是否具有短路评估?
|
给出以下代码:
if (is_valid($string) && up_to_length($string) && file_exists($file))
{
......
}
如果is_valid($string)
返回false
,php解释器是否还会检查以后的条件,例如up_to_length($string)
?
如果是这样,那么为什么它在不需要时会做额外的工作呢?
没有找到相关结果
已邀请:
8 个回复
浩挎
夏瓤跋棘
可以重写为:
但是,如果yes块还需要运行某些功能怎么办?
好吧,由于短路评估,仍然可以重写为三元:
在这种情况下,表达式(do_something()|| true)不会改变三元的整体结果,但确保三元条件保持
,而忽略the10ѭ的返回值。
宦哨抹存胳
芜任亮蜡
和
。 他们总是对两个操作数求值。 逻辑运算符为
,
,
和
。 所有四个运算符仅在需要时评估右侧。
和
的优先级低于
和
。请参见下面的示例。 从PHP手册中:
在此示例中,
将是
,
将是
。
广躺椽
短路运算符。 我运行了此测试:
并且PHP 7.0.8返回
,而不是
。
豹芜澈
我不记得我从哪里得到以下逻辑,但是如果您执行以下操作;
您可以跳过问号后再写一次true条件变量的操作,例如:
作为一个非常重要的观察,以这种方式使用三元运算符时,您会注意到,如果进行比较,则将仅传递该比较的值,因为不仅只有一个变量。例如:
卧沫
条件1的第二部分|| saySomething()是无关紧要的,因为这将始终返回true。不幸的是saySomething()被评估并执行。 也许我误解了短路表达式的确切逻辑,但对我来说,这看起来并不像“它将进行尽可能少的比较”。 而且,这不仅是性能方面的问题,如果您在比较中进行分配,或者进行了有意义的改变,而不仅仅是比较内容,那么结果可能会不同。 无论如何...要小心。
妊辽剁茧
当您需要例如调用两个函数,即使第一个函数返回false时,这也很有用。