**不识庐山真面目,只缘身在此山中。**
PHP做为一种优秀的脚本语言,在当前的互联网应用中可谓风光无限。从简单的“Hello World!”到各种框架开发,架构设计,性能优化,到编写PHP扩展,PHP编程中涉及的知识结构和跨度蔚为可观。从这个角度上来看,学会PHP编程的语法可能并不困难,但如果想真正用好PHP,在不同的场景下发挥PHP最大的性能和效用,对PHP的理解到达熟悉和精通的程度,就不得不去了解PHP语言的实现,进一步理解PHP语法的本质,这确实是一件需要更多的精力和时间的事情。
PHP语言经过许多人多年的淬炼,性能不断优化,支持的语法现象与各种特性也越来越多。导致PHP内核的代码中,涉及知识面比较广泛,具体实现也非常复杂,从脚本的编译解析到执行以及和Web服务器等的配合,内存管理,语法实现等等。为了不过早陷入细节的沼泽,我们先从整体上来接触PHP的实现,先对PHP的整体结构,生命周期,PHP与其它容器(如Apache)的交互,PHP的整个执行过程等进行一个大概的了解,从而有一个整体的概念。
> 关于PHP是如何一步步从一个朴素的想法发展到今天的模样,可以了解一下PHP的历史: http://en.wikipedia.org/wiki/PHP
从宏观上来看,PHP内核的实现与世界上绝大多数的程序一样,接收输入数据,做相应处理然后输出(返回)结果。我们编写的代码就是PHP接收的输入数据,PHP内核对我们编写的代码进行解释和运算,最后返回相应的运算结果。然而,PHP与我们自己平时写的一般的C程序有所不同的是,我们的程序一般用来解决某个具体问题,而PHP本身实现了把用户的逻辑“翻译”为机器语言来执行的功能,这也是各种编译语言与承载具体业务逻辑的程序代码的一个明显区别。于是PHP就多出一个把用户代码“翻译”成具体操作的步骤:**词法分析、语法分析**
当用户代码输入给PHP内核去执行的时候,PHP内核会对PHP代码进行词法分析和语法分析,词法分析是把PHP代码分割成一个个的“单元”(TOKEN),语法分析则将这些“单元”转化为Zend Engine可执行的操作。然后PHP内部的Zend Engine对这些操作进行顺次的执行。Zend Engine是PHP内核的核心部分,负责最终操作的执行和结果的返回,可以理解成为PHP内核中的“发动机”。
于是PHP代码的执行过程可以简单描述为下图:
![图2.1 单进程SAPI生命周期](http://box.kancloud.cn/2015-07-06_559a6328de32b.png)
图2.1 单进程SAPI生命周期
接下来,本章会对图中的每一部分展开详细的讨论,主要包括以下内容:
1. PHP内部的生命周期
1. SAPI接口
1. 词法分析与语法分析
1. 什么是Opcodes
- 第一章 准备工作和背景知识
- 第一节 环境搭建
- 第二节 源码结构、阅读代码方法
- 第三节 常用代码
- 第四节 小结
- 第二章 用户代码的执行
- 第一节 生命周期和Zend引擎
- 第二节 SAPI概述
- Apache模块
- 嵌入式
- FastCGI
- 第三节 PHP脚本的执行
- 词法分析和语法分析
- opcode
- opcode处理函数查找
- 第四节 小结
- 第三章 变量及数据类型
- 第一节 变量的结构和类型
- 哈希表(HashTable)
- PHP的哈希表实现
- 链表简介
- 第二节 常量
- 第三节 预定义变量
- 第四节 静态变量
- 第五节 类型提示的实现
- 第六节 变量的生命周期
- 变量的赋值和销毁
- 变量的作用域
- global语句
- 第七节 数据类型转换
- 第八节 小结
- 第四章 函数的实现
- 第一节 函数的内部结构
- 函数的内部结构
- 函数间的转换
- 第二节 函数的定义,传参及返回值
- 函数的定义
- 函数的参数
- 函数的返回值
- 第三节 函数的调用和执行
- 第四节 匿名函数及闭包
- 第五节 小结
- 第五章 类和面向对象
- 第一节 类的结构和实现
- 第二节 类的成员变量及方法
- 第三节 访问控制的实现
- 第四节 类的继承,多态及抽象类
- 第五节 魔术方法,延迟绑定及静态成员
- 第六节 PHP保留类及特殊类
- 第七节 对象
- 第八节 命名空间
- 第九节 标准类
- 第十节 小结
- 第六章 内存管理
- 第一节 内存管理概述
- 第二节 PHP中的内存管理
- 第三节 内存使用:申请和销毁
- 第四节 垃圾回收
- 新的垃圾回收
- 第五节 内存管理中的缓存
- 第六节 写时复制(Copy On Write)
- 第七节 内存泄漏
- 第八节 小结
- 第七章 Zend虚拟机
- 第一节 Zend虚拟机概述
- 第二节 语法的实现
- 词法解析
- 语法分析
- 实现自己的语法
- 第三节 中间代码的执行
- 第四节 PHP代码的加密解密
- 第五节 小结
- 第八章 线程安全
- 第二节 线程,进程和并发
- 第三节 PHP中的线程安全
- 第九章 错误和异常处理
- 第十章 输出缓冲
- 第十六章 PHP语言特性的实现
- 第一节 循环语句
- foreach的实现
- 第二十章 怎么样系列(how to)
- 附录
- 附录A PHP及Zend API
- 附录B PHP的历史
- 附录C VLD扩展使用指南
- 附录D 怎样为PHP贡献
- 附录E phpt测试文件说明
- 附录F PHP5.4新功能升级解析
- 附录G:re2c中文手册