我正在浏览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。如果你仍然想要警告我不要接受这种做法的危险,请包括例子。
编辑:在用$var = mysql_(...) or die()
替换or
后更改我的简单||
代码后,我发现使用||
和&&
会有多烦人运算符代替and
和or
。 代码根本无效!根据我的理解,前一个构造将TRUE
或FALSE
的返回值分配给$var
,后者依次使用$var
来生成警告/错误/意外行为。后一个结构首先将mysql_(...)
的结果分配给$var
,然后评估=
和die
的结果。
这对我来说是一个很好的教训,我更好1.开始使用PDO / mysqli并自己处理错误2.在编写我上面称为个人风格的内容之前请三思。
//注意自己:在用另一个编写代码时不要使用一种脚本/解释语言的经验,每一种都是独一无二的,并且有自己的怪癖和陷阱,那只是悲伤*叹气*
答案 0 :(得分:7)
代码
$e = isset($a) and isset($b);
的解析与
相同($e = isset($a)) and isset($b);
因此$e
确定的isset($a)
和作业true
- 与评估isset($b)
无关。