很多人知道,php是用c写的。那么到底c写了php的什么呢?要理解这个,我们先从一个php脚本如何执行说起。
假设有个php文件helloWorld.php:
<?php
$str = "hello world!";
echo $str;
然后我们在命令行执行:php helloWorld.php。之后会发生什么呢?
①、机器会打开一个叫php的程序,这个程序是用c写的。
②、php程序会去读取helloWorld.php里面的内容,然后对其内容进行词法分析将内容(也就是php代码)切分成一个个的token,比如上面的代码会得到如下的token集:
array (
0 => array (
0 => 368,
1 => '<?php',
2 => 1,
),
1 => array (
0 => 371,
1 => '',
2 => 2,
),
2 => '=',
3 => array (
0 => 371,
1 => '',
2 => 2,
),
4 => array (
0 => 315,
1 => '"hello world!"',
2 => 2,
),
5 => ';',
6 => array (
0 => 371,
1 => '',
2 => 3,
),
7 => array (
0 => 316,
1 => 'echo',
2 => 4,
),
8 => array (
0 => 371,
1 => '',
2 => 4,
),
9 => ';'
)
③、php程序对这些token集进行语法分析,如果没有错误就将其编译成一条条的opcode,这些opcode的结构如下:
struct _zend_op {
opcode_handler_t handler; //读到这条opcode时,会执行这个函数,这个函数是根据opcode指令码与处理函数映射关系获得的
znode result;
znode op1;
znode op2;
ulong extended_value;
uint lineno;
zend_uchar opcode;//opcode指令码
};
④、php的zend引擎一条一条的读取opcode,根据opcode获取函数名,然后zend引擎执行其内部相应的函数。
到这里,我们大致明白:我们写的php代码,会被转化为一堆指令集,然后php程序根据这些指令集,执行其内部相应的函数,最终得到我们想要的结果。所以,“php是由c写的”这句话可以这样理解:用c语言编写了一个程序,这个程序我们把他叫做zend。运行这个程序,并向这个程序传入一个后缀为php的文件名,这个程序读取文件中的内容,然后把内容转化为一系列的指令,并根据这些指令,运行zend内部相应的函数。