搜索关于此的文档几乎是徒劳的,因为搜索引擎似乎假设我在询问&&
操作数。我在PHP.net上找到的内容,触及它作为操作数的用途,但我仍然不清楚它是如何在我遇到的代码片段中工作的。
! empty( $foo )
and $bar .= 'string';
我认为我理解为类似于:
if ( ! empty( $foo ) ){
$bar .= 'string';
}
但它似乎不是一个无括号的if
条件(如果删除and
则会中断)。
我应该说我做了 - 或者我认为我做过 - 了解&&
and
在比较的情况下如何运作$bar .= 'string'
。它是在它自己的行上(部分地)使用它,并且! empty( $foo )
不是提示问题的测试条件。
更新
我从评论中的讨论中理解的内容如下:
如果false
为and
,则会使操作短路;超出and
的任何内容都不会被评估。
$bar .= 'string'
仍然只是履行其作为比较运算符(?)的角色。在这种用法中,and
的{{1}}方不是另一种测试条件......或者是它?是评估$bar
是否真实(在PHP中,它似乎是事先是否声明/定义了$bar
),然后继续将string
连接到它?
答案 0 :(得分:2)
那是短路评估。如果你将其分解,可以更容易理解:
!empty($foo) // 1) expression
and // 2) logical operator
$bar .= 'string'; // 3) assignment, expression
empty($foo)
将被评估,返回true
或false
,然后将被否定and
也可以是&&
,它是logical operator(两者之间的差异是他们的precedence,如this answer中所述)$bar .= 'string'
是一项作业,在PHP those are expressions, too中。它们评估指定的值,在这种情况下是一些字符串。只要该字符串不是empty or "0"
,它就会评估为true
。 只有当!empty($foo)
产生true
时,PHP才会查看and
之后的内容:
! empty( $foo ) // If false, stop right here, otherwise...
and $bar .= 'string'; // ...see what this evaluates to
因为在你的例子中,整个表达式的结果没有以任何方式使用,所以字符串赋值的计算结果并不重要 - 技巧只是根据!empty($foo)
执行它。因此,您的if
版本确实具有相同的效果。
现在,为什么在删除and
时这会中断?因为那样你最终会得到无效的PHP:!empty($foo) $bar .= 'string';
稍微更改原始代码段,使用&&
代替and
并添加一些括号,使其更易于阅读和理解:
!empty($foo) && ($bar .= 'string');
此外,当使用PHP与mysql时,这种快捷方式很常见。您可能已经在某个方面看到过这条线:
mysqli_connect($host,$user,$pass,$db) or die();
这是相同的逻辑。如果可以建立连接,mysqli_connect()
将返回一个对象(评估为true
),第二部分将永远不会被查看。但是,如果连接失败,将评估die()
并结束脚本执行。