结果:
shell_exec('php yourotherscript.php > /dev/null 2>/dev/null &');
是:
var_dump(null != $a = 15);
var_dump($a);
为什么此脚本不会触发错误?
由于bool(true)
int(15)
(不等于运算符)的优先级高于!=
(赋值运算符),因此首先应将=
与$a
进行比较?
答案 0 :(得分:6)
我能找到的唯一原因是文档说这仍然是合法的:http://php.net/manual/en/language.operators.precedence.php#example-129
这似乎是上表中显示的例外。
答案 1 :(得分:2)
这不是关于运算符优先级,而是关于:运算符优先级列表不会告诉您详细信息(实际上,它们从不这样做),例如:关于野牛规则以及由此产生的模式匹配和堆栈减少
为简单起见,我们不要使用var_dump语句null != $a = 15;
这就是解析器"看到"这句话 - 或者:看到它是一个陈述
(我希望这将在任何地方以固定宽度字体呈现......)
null != $a = 15 ;
T_VARIABLE
identifier compound_variable T_LNUMBER
namespace_name reference_variable common_scalar
general_constant base_variable scalar
scalar base_variable_with_functions_calls expr_without_variable
expr_without_variable variable = expr
expr T_IS_NOT_EQUAL \______ expr_without_variable _________/
\__________________ expr ____________________________________________/ ;
\_________________ unticked_statement _______________________________________________/
statement
(您可以在https://github.com/php/php-src/blob/PHP-5.6.15/Zend/zend_language_parser.y)
查找规则在这种情况下,赋值算子没有特殊规则;解析器根本没有其他方式来匹配语句,因此优先级不适用。