PHP中`和`的目的/功能是什么?

时间:2017-03-17 15:43:05

标签: php

搜索关于此的文档几乎是徒劳的,因为搜索引擎似乎假设我在询问&&操作数。我在PHP.net上找到的内容,触及它作为操作数的用途,但我仍然不清楚它是如何在我遇到的代码片段中工作的。

! empty( $foo )
    and $bar .= 'string';

我认为我理解为类似于:

if ( ! empty( $foo ) ){
    $bar .= 'string';
}

但它似乎不是一个无括号的if条件(如果删除and则会中断)。

我应该说我做了 - 或者我认为我做过 - 了解&& and在比较的情况下如何运作$bar .= 'string'。它是在它自己的行上(部分地)使用它,并且! empty( $foo )不是提示问题的测试条件。

更新

我从评论中的讨论中理解的内容如下:

如果falseand,则会使操作短路;超出and的任何内容都不会被评估。

$bar .= 'string'仍然只是履行其作为比较运算符(?)的角色。在这种用法中,and的{​​{1}}方不是另一种测试条件......或者是它?是评估$bar是否真实(在PHP中,它似乎是事先是否声明/定义了$bar),然后继续将string连接到它?

1 个答案:

答案 0 :(得分:2)

那是短路评估。如果你将其分解,可以更容易理解:

!empty($foo)            // 1) expression
   and                  // 2) logical operator
      $bar .= 'string'; // 3) assignment, expression
  1. empty($foo)将被评估,返回truefalse,然后将被否定
  2. and也可以是&&,它是logical operator(两者之间的差异是他们的precedence,如this answer中所述)
  3. $bar .= 'string'是一项作业,在PHP those are expressions, too中。它们评估指定的值,在这种情况下是一些字符串。只要该字符串不是empty or "0",它就会评估为true
  4. 只有当!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()并结束脚本执行。