AST的优势
在 PHP 5 中,从 PHP 代码到 opcode 的执行过程如下:先进行词法扫描分析,将源文件转换成 Token;然后进行语法分析,在此阶段生成 Op_array。相比 PHP 5, PHP 7 的执行过程多了一步,其执行过程如下:先进行词法扫描分析,将源文件转换成 Token;然后进行语法分析生成 AST,最后 AST 生成 Op_array。PHP 7的执行过程比 PHP 5 的多了一步,所以按常理来说这会增加程序的执行时间,同时会增加内存的消耗。但事实上内存的消耗确实增加了,但是执行时间上有所降低。具体可以使用 PHP 7 的测试用例验证: https://gist.github.com/nikic/289b0c7538b46c2220bc 。得出的结论是使用 AST 之后程序的执行时间整体上有 10%~15% 的提升,但是内存的消耗也在增加,在大文件单次编译中增加明显,但是在整个项目执行过程中并不是很严重。
需要注意的是,以上的结果都是基于没有 opcache 的情况。在生产环境打开 opcache 的情况下,内存的消耗增加也不是很大的问题。
那么 AST 有什么好处呢?首先 AST 解决了很多语法问题,比如括号不影响行为,代码如下:
<?php
($a)['b'] = 1;
对于这段代码,我们通过 gdb
可以得出其 AST
,如图10-26所示。

Figure 1. 图10-26 带括号的表达式AST的示意图
而我们使用 PHP 5 执行这段代码会报语法错误:
./php test.php
Parse error: syntax error, unexpected '[' in /root/php5/test.php on line 2
另外,AST
还解决了变量语法一致性的问题,PHP 5 与 PHP 7 变量语法对照表如表10-5所示。

Figure 2. 表10-5 PHP 5与PHP 7变量语法对照表
PHP 7 引入 AST
后,语法规则是从左到右,同时遵循括号不影响行为的原则,给语法表达带来了很大的便利。