PHP 与 C 语言不同,他是一个解释型语言,PHP 本身实现了将用户代码翻译为机器语言执行的功能,这个翻译过程包含了词法分析与语法分析两个过程
完成词法分析、语法分析后,PHP 代码被转化为 Zend 引擎可以执行的操作,然后 Zend 引擎就可以对这些操作进行顺次执行
Zend 引擎是 PHP 内核的核心部分,负责最终操作的执行和结果的返回
词法分析
词法分析的工作是将用户代码切分成一个个单元(TOKEN)
PHP 的词法分析器是通过 lex 生成的,此法规则文件是 $PHP_SRC/Zend/zend_language_scanner.l
通过调用 token_get_all 可以查看这一阶段产生的分词结果
$a = "<?php
echo 'hello world';
?>";
var_dump(token_get_all($a));
?>
运行结果为:
array(7) {
[0] =>
array(3) {
[0] =>
int(372)
[1] =>
string(6) "<?php
"
[2] =>
int(1)
}
[1] =>
array(3) {
[0] =>
int(316)
[1] =>
string(4) "echo"
[2] =>
int(2)
}
[2] =>
array(3) {
[0] =>
int(375)
[1] =>
string(1) " "
[2] =>
int(2)
}
[3] =>
array(3) {
[0] =>
int(315)
[1] =>
string(13) "'hello world'"
[2] =>
int(2)
}
[4] =>
string(1) ";"
[5] =>
array(3) {
[0] =>
int(375)
[1] =>
string(1) "
"
[2] =>
int(2)
}
[6] =>
array(3) {
[0] =>
int(374)
[1] =>
string(2) "?>"
[2] =>
int(3)
}
}
语法分析
语法分析产生了 Zend 引擎可以处理的操作数
PHP 的语法分析器是通过 bison 生成的,规则文件是 $PHP_SRC/Zend/zend_language_parser.y
bison 根据规则生成操作数,然后由 Zend 引擎进行编译,将代码便以为 opcode,然后 Zend 引擎回去执行这些 opcode,当然,在执行这些 opcode 的过程中可能还需要反复进行编译和执行的过程
如果在语法分析的过程中出现了不符合语法规则的情况,则会输出错误信息
示例 -- echo 的执行
echo 'hello world';
?>
这段简单的代码的执行过程中进行了哪些操作呢?
首先,在上面的介绍中,词法分析阶段生成了 7 个 token
然后,由语法分析器对着 7 个 token 进行分析,得到一条 ZEND_ECHO 指令
该指令由 C 语言的函数 zend_print_variable(zval *z) 执行,他的功能就是将传递进来的字符串打印出来