PHP-php的一个优先级问题

WordPress 开发 WordPress 开发 主题:1098 回复:2322

PHP-php的一个优先级问题

泛泛之交 发布于 2017-06-19 字数 117 浏览 1029 回复 7
if ($a = 100 && $b = 200) {
var_dump($a, $b);
}

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(7

瑾兮 2017-09-29 7 楼

这也可以说是PHP的一个特例,有时候PHP并一定会完全遵守优先级的规定,这个问题在PHP的英文手册里也说明了:

//以下是引用了PHP手册的原文

 Note: Although = has a lower precedence than most other operators, PHP will still allow expressions similar to the following: if (!$a = foo()), in which case the return value of foo() is put into $a.

清晨说ぺ晚安 2017-08-18 6 楼

这个现象非常正常啊。
$a = 100 && $b = 200;
php执行的顺序是:
$a = (100 && ($b = 200));
所以$a是true,$b是200。
虽然&&具有高优先级,但是在这个表达式中必须先执行$b=200,再执行100 && $b,因为如果先执行100 && $b的话表达式就成了
$a = (100 && $b) = 200;
很显然,不能给(100 && $b)这个表达式赋值,这样会得到语法错误。所以php为了让代码能运行,调整了右边的=的优先级(如果你遇到写得烂点的语法分析器,可能就真的给你报语法错误了)。

泛泛之交 2017-08-08 5 楼

简单的说,先举个例子var_dump(100 && 200);输出值:bool(true)
这个不难理解;
如果$a = 100 && $b = 200,很明显“&&”是类似“合并”,“且”的意思,$a=100 && 200,所以var_dump($a)=var_dump(100 && 200),故输出值:bool(true);

同理$b=200,var_dump($b)=var_dump(100 && 200),故输出值:int(200)
var_dump($a,$b)输出值:bool(true) int(200)

此例子if ($a = 100 && $b = 200) {
var_dump($a, $b);
}
&&优先级是高于=,没有错误的。

瑾兮 2017-08-04 4 楼

// "&&" 的优先级比 "and" 高
$g = true && false; // $g 被赋值为 (true && false),结果为 false
$h = true and false; // $h 被赋值为 true [Altair注:"=" 的优先级比 "and" 高]
var_dump($g, $h);

这个例子就证明了 ‘&&’ 的优先级是比 ‘ = ’高的

晚风撩人 2017-07-29 3 楼

这个里面有一个执行的先后顺序问题,比如一些编译器是从左到右一些编译器是从右到左,很坑爹.PHP的编译器是从左到右的(不包括个人修改的个性化编译器).因此就像上面的,先执行了$a=100,这个肯定为真,然后执行了$b=200,而且&&是在=前面执行了,这个没有颠倒优先级.

泛泛之交 2017-07-11 2 楼
if (($a = 100) && $b = 200) {
    var_dump($a, $b);
}

这段代码输出 100 200

瑾兮 2017-07-07 1 楼

个人理解是:
括号内的运算是从右到左的,所以首先 把200赋值给$b,然后把 100 && $200的结果赋值给$a。
所以结果就是 bool(true) int(200) 了。