【发布时间】:2011-10-22 06:20:27
【问题描述】:
我正在浏览 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 语句中。我知道这是不推荐的做法,可能会在背咬我。但是,我确实想掌握这项技能,因为我喜欢写这样一个班轮,并希望将其用作我的个人风格。
所以我的问题是:
- 哪个运算符(
&&或and)短路了? - 手册说
&&优先于and,但有人可以通过将短路运算符特性/功能/特性与运算符优先级混合来举例说明这一点。 (基本上是优先级和短路的混搭)
请详细说明运算符的短路和返回值性质。
PS: 1. 希望这些运算符的关联性是一样的,直观的,但是如果你知道任何怪癖,请赐教。
PS:2.如果您仍然想警告我这种做法的危险,请举例说明。
编辑:通过将or 替换为|| 来更改我的简单$var = mysql_(...) or die() 代码后,我发现使用|| 和&& 运算符而不是and 和or 是多么烦人. 代码根本不起作用!据我了解,前一个构造将TRUE 或FALSE 的返回值分配给$var,这反过来又使$var 的所有顺序使用产生警告/错误/意外行为。后一个构造首先将mysql_(...) 的结果分配给$var,然后评估= 和die 的复合。
这对我来说是一个很好的教训,我最好 1. 开始使用 PDO/mysqli 并自己处理错误 2. 在写我上面所说的作为个人风格的东西之前三思而后行。
//注意自己:不要在用另一种语言编写代码时使用一种脚本/解释性语言的经验,每一种都是独一无二的,都有自己的怪癖和陷阱,这只是可悲*叹气*
【问题讨论】:
-
@Gordon :感谢您的参考。我检查了列表,虽然有几个问题似乎回答了部分问题(比如我已经知道的优先级)。恕我直言,没有详细讨论运算符的短路性质及其优先级。
-
示例链接上的评论作者提到了运算符优先级,这表明 AND 关键字在等号之后被评估。这看起来很奇怪,但它让我想起了一些脚本使用的
mysql_connect(...) or die()行。 -
确实!我每天都使用
mysql_connect(...) or die()。我必须 1. 转移到 PDO,2. 始终使用&&和||。 @詹姆斯谢谢
标签: php operator-precedence short-circuiting