6

我正在浏览 php.net 的运算符优先级部分,并遇到了这个例子,它说

$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)or$verbose and print "Updating dataArray\n"作为单独的语句,允许我控制这些 print(_r) 语句。这来自我曾经写过很多[[ $condition ]] && { #Do if true } || { #Do if false }. 在 BASH 中,我知道它们是短路的,并利用这个事实编写了很多简单的单行。
现在我观察到很多这种做法(写作$verbose and print)正在慢慢地潜入我的if陈述中。我知道这不是推荐的做法,可能会在后面咬我。但是,我确实想掌握这项技能,因为我喜欢写这样一个班轮,并希望将其用作我的个人风格

所以我的问题是(是):

  1. 哪个运算符(&&and)短路了?
  2. 手册说&&优先于and,但是有人可以通过将短路的运算符特性/功能/特性与运算符优先级混合来举例说明。(基本上是优先级和短路的混搭)

请详细说明运算符的短路和返回值性质。

PS:1.希望这些操作符的关联性是一样的和直观的,但是如果你知道任何怪癖,请赐教。
PS:2.如果您仍然想警告我这种做法的危险,请举例说明。

$var = mysql_(...) or die()编辑:通过替换更改我的简单代码or后,我发现使用and运算符而不是and||是多么烦人。代码根本不起作用!据我了解,前一个构造将返回值分配给or ,这反过来又使所有顺序使用来生成警告/错误/意外行为。后一种构造首先将 的结果分配给,然后计算 和 的复合物。这对我来说是一个很好的教训,我最好 1. 开始使用 PDO/mysqli 并自己处理错误 2. 在写我上面所说的个人风格 之前三思而后行||&&andorTRUEFALSE$var$varmysql_(...)$var=die
.
//自我注意:不要在用另一种语言编写代码时使用一种脚本/解释性语言的经验,每一种都是独一无二的,有自己的怪癖和陷阱,这只是悲伤*叹息*

4

1 回答 1

7

编码

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

被解析为

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

因此$e,由isset($a)和 分配确定,与true评估无关isset($b)

于 2011-08-08T09:56:52.900 回答