IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

PHP运算符优先级的一个例外

风雪之隅 2010-07-27 23:24:31 累计浏览 3,113 次
本机暂存

今天在老王的技术手册看到一个问题:

<?phpif ($a = 100 && $b = 200) {     var_dump($a, $b);}

输出是什么?

这个问题, 咋一看或许觉得简单, 但其实仔细推敲并不简单,

如果说布尔与之前的部分, 是由于优先级的问题, 但是如果仅仅是优先级的问题的话, 那么结果应该是:

$a = (100 && $b) = 200

而实际上的结果, 确实高优先级的&&让步给次优先级的=, 让 $b = 200 先结合了.

究其原因, 是因为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.

这样的设计, 个人不发表看法, 反正在C语言中, 这样类似的语句是判定为语法错的. PHP采用这样的设计, 很可能是历史原因,

有好奇的同学, 会想知道到底为什么, 之前jayeeliu网友也问过:

laruence你好:
问一个php运算符优先级的问题
$t == 1 && $tt = 2
按照php运算符优先级应该是
(($t == 1) && $tt) = 2
这个顺序执行,但实际上应该是
($t == 1) && ($tt = 2)
我有些不太理解。

其实也简单, 运算符优先级是在存在二义性文法的时候的一种规约规则选择的手段, 而PHP的语法分析文件定义中, 却让等号和T_BOOLEAN_AND(&&)之前不存在了规约冲突:

expr_without_variable:  // 有隐规则存在, 相当于T_BOOLEAN_AND成为了"一元操作符".  | expr T_BOOLEAN_AND { zend_do_boolean_and_begin(&$1, &$2 TSRMLS_CC); } exp

最后, 顺便说一下, PHP对应于T_BOOLEAN_AND 还定义了 T_LOGICAL_AND(and) 和 T_LOGICAL_OR(or) , 这俩个的优先级都低于等号, 于是就会有了, 很多PHP入门教材示例代码中经典的:

$result = mysql_query(*) or die(mysql_error());

类似的还可以用or来实现三元操作符(?:)的功能:

     $person = $who or $person = "laruence";//等同于:     $person = empty($who)? "laruence" : $who;

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 使用gettext来支持PHP的多语言 (累计阅读 39,267)
  2. 程序员技术练级攻略 (累计阅读 35,468)
  3. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,162)
  4. Paypal接口详细代码(PHP版,非API接口) (累计阅读 19,407)
  5. 每个程序员都应该学习使用Python或Ruby (累计阅读 17,917)
  6. 我的PHP,Python和Ruby之路 (累计阅读 13,146)
  7. include(“./file.php”)和include(“file.php”)区别 (累计阅读 12,788)
  8. 15个最好的免费开源电子商务平台 (累计阅读 12,539)
  9. Redis消息队列的若干实现方式 (累计阅读 12,085)
  10. 到底什么是MVC? (累计阅读 11,865)