“&&”之间的区别和“和”:运算符优先级和短路

时间:2011-08-08 09:54:44

标签: php operator-precedence short-circuiting

我正在浏览php.net的运算符优先级部分并遇到this example,其中说

$a = 1;
$b = null;
$c = isset($a) && isset($b);
$d = ( isset($a) and isset($b) );
$e = isset($a) and isset($b);
var_dump($a, $b, $c, $d, $e);
//Result:
int(1)
NULL
bool(false)
bool(false) <== I get this
bool(true)  <== I do not get this

我在代码中使用了大量的调试和详细的print(_r)语句来跟踪我在代码中的位置。所以我使用$debug and print_r($dataArray)$verbose and print "Updating dataArray\n"作为代码之间的单独语句,允许我控制这些print(_r)语句。这来自我以前写过很多[[ $condition ]] && { #Do if true } || { #Do if false }的BASH经验。在BASH,我知道他们是短路的,并用这个事实来编写很多简单的一个衬里 现在我观察到很多这种做法(写作$verbose and print)正慢慢地进入我的if陈述。我知道这是不推荐的做法,并且可以在后面中咬我。但是,我确实想掌握这项技能,因为我喜欢写这样的一个衬垫,并希望将它用作我的个人风格

所以我的问题是(是):

  1. 哪个运算符(&&and)被短路了?
  2. 手册说&&优先于and,但有人可以通过将短路的运营商功能/功能/特性与运营商优先级混合来证明这一点。 (基本上是混合和匹配的优先和短路)
  3. 请详细说明操作员的短路和返回值性质。

    PS:1。我希望这些操作员的相关性是一样的,直观,但如果你知道任何怪癖,请赐教。
    PS:2。如果你仍然想要警告我不要接受这种做法的危险,请包括例子。

    编辑:在用$var = mysql_(...) or die()替换or后更改我的简单||代码后,我发现使用||&&会有多烦人运算符代替andor代码根本无效!根据我的理解,前一个构造将TRUEFALSE的返回值分配给$var,后者依次使用$var来生成警告/错误/意外行为。后一个结构首先将mysql_(...)的结果分配给$var,然后评估=die的结果。
    这对我来说是一个很好的教训,我更好1.开始使用PDO / mysqli并自己处理错误2.在编写我上面称为个人风格的内容之前请三思。 //注意自己:在用另一个编写代码时不要使用一种脚本/解释语言的经验,每一种都是独一无二的,并且有自己的怪癖和陷阱,那只是悲伤*叹气*

1 个答案:

答案 0 :(得分:7)

代码

$e = isset($a) and isset($b);

的解析与

相同
($e = isset($a)) and isset($b);

因此$e确定的isset($a)和作业true - 与评估isset($b)无关。