既然你在阅读本书,那说明你也是对PHP很感兴趣的读者,在窥探到PHP内部实现之后或许也蠢蠢欲动想要共享自己的力量。下面进行一些简单的说明。
很多人以为为PHP做贡献(contribute)只是简单的为PHP提交补丁,其实在广义上来说,为PHP做贡献有很多种方式,这包含但不限于:
- 宣传和参与PHP的讨论
- 发现和报告或者提到补丁修复PHP的bug
- 编写和翻译PHP手册
- 编写PHP相关的书籍
- 写PHP相关技术的博客
- 为PHP增加新功能
- 编写和贡献PHP扩展或者库
所以很可能大部分的读者目前其实已经是在为PHP做贡献了。只不过如果你是本书的读者,可能更想为PHP-Runtime做贡献,比如:修复PHP代码的bug,提交功能改进。
我们可能根据自己的特长来为PHP做贡献,如果你英语好,那么翻译手册将会是你的强项。如果你的C比较好,那么可以为PHP修改bug,如果你对PHP语言的语法或者功能有改进想法,你可以提交改进方法,当然如果你能将该功能实现出来那更好不过了。
下面介绍一下,为PHP做贡献的方方面面。
## 沟通方式[]()
## 邮件组[]()
在很多开源项目中,邮件组都是作为最主要的沟通方式,邮件组虽然古老,但是却很有效,每个人都会有一个邮箱,可以快捷的使用邮件客户端来沟通,目前的邮件客户端都很好用,可以根据主题进行汇总。Gmail和QQmail就做的不错。
PHP官方的邮件组都列在这里了: [http://php.net/mailing-lists.php](http://php.net/mailing-lists.php)
## IRC[]()
国内IRC使用的不太多,PHP核心开发者都会在 http://www.efnet.org/ 的#php.pecl 频道。如果你想直接找某个开发者,在#php.pecl频道应该可以找的到 :)
## 报告和修复Bug[]()
PHP的bug可以在[http://bugs.php.net](http://bugs.php.net)上提交。在这里你可以提交和php相关的各种bug,虽然是bug管理,其实这里还可以提出你的需求,比如你觉得PHP缺失某个功能,你可以在这里提交。在提交的同时,如果你能提供实现补丁那再好不过了。没有补丁也没有关系,如果这的确是个bug,根据紧急和难易程度可能会有同学帮你修复,如果是一个功能改进,同时对PHP的改动比较大,那么这个需要提交到php-internals邮件组进行讨论,如果已经有实现了,讨论充分后就可以进行投票了。如果通过投票,那么恭喜你。
> 这里的bug通指bug和feature,也就是非预期行为以及功能需求。
## 原则[]()
这里的的Bug指的是PHP语言本身的bug,而不是应用程序的bug,比如某个函数的行为和预期不一致,或者运行某段程序后PHP崩溃了,或者性能低下,你都可以提交报告。
这有一些基本的原则:
如果是bug:
1. 你需要确认这的确是PHP的bug,而不是应用程序的bug
1. 确认你使用正确,也就是是否和PHP手册文档使用一致
1. 尽量用最少的代码来重现问题。这将有利于问题的追查
## 修复[]()
如果你发现了PHP的一个bug,而同时你想到了解决方案,可以在[Github][http://github.com/php/php-src]上提交一个Pull Request,或者也可以直接把修改的patch上传到你所提交的bug页
## 测试[]()
在你发现了一个bug或者实现一个功能时,你需要为你的bug或者功能编写测试,测试用例的编写可以参考[附录E phpt测试文件说明](#)
测试时可以使用make test TESTS=/path/to/your/bugXXXX.phpt 来进行测试。通常如果是个bug,那么会将测试的名称命名为bugXXXX.phpt XXXX为bug的ID。
## 贡献功能[]()
## RFC (Request For Comments)[]()
比如你觉得PHP不支持重载很不习惯,你想PHP支持这个特性,对于这个特性来说,这是一个非常大的变动,这样的话你最好编写一个RFC说明一下你为什么需要这样一个特性。因为PHP的用户量是非常大的,任何一个变动都会影响到非常多的人,所以你必须说服绝大多数人赞同你的想法。
你的RFC可以放在任何地方,比如直接发送到邮件组讨论,或者放在github上,不过通常,你可以把RFC放在PHP官方的wiki上方便讨论。
1. 在[https://wiki.php.net/start?do=register](https://wiki.php.net/start?do=register)上申请一个账号。
1. 发送邮件到: php-webmaster@lists.php.net 申请RFC的编写权限(Request for RFC karma),同时你得提供你的wiki用户名,最好同时说明你要创建什么样的一个RFC。
好了后你就可以编写RFC了,具体流程见官方的说明吧:[https://wiki.php.net/rfc/howto](https://wiki.php.net/rfc/howto)
## 邮件组讨论[]()
编写好了后,你可以把你的RFC发送到internals@lists.php.net邮件组。当然为了防止你的RFC白写了,你可以直接把你的需求发送到邮件组看看大家的反应,看看大家是否对这个特性或者变动感兴趣。
> 为了保证你收到大家的邮件,最好在[http://php.net/mailing-lists.php](http://php.net/mailing-lists.php)订阅一下 邮件组的邮件,同时也推荐大家订阅这个邮件组,可以知道PHP发展的最新动态。
邮件发出来以后,大家可能会质疑你的想法,这时你就需要对家的疑问进行解答。尽可能的把自己的想法表达清楚。
经过一番讨论后,如果感觉进展还可以,那么你就可以发起投票了。投票是在wiki上进行的,可以参考[https://wiki.php.net/rfc/trailing-comma-function-args](https://wiki.php.net/rfc/trailing-comma-function-args)
修改wiki后需要再给邮件组发送邮件,通知到大家来进行投票。
提议被接受的比如为:50%+1
## 代码实现[]()
如果你已经实现了你想要的功能,记得在RFC中体现,很多时候有一些功能可能大家都希望有,但是由于没有人来实现或者现有的实现不够好。如果有一个实现可能会大大提高你的RFC被接受的可能性。
如果你不太熟悉PHP内核也没有关系,如果的确是个不错的主意,肯定会有人来帮你实现的。
> 所以如果你有不错的想法欢迎反馈
## 贡献PECL扩展[]()
如果你写了一个扩展,想分享给大家可以通过pecl来发布你的扩展。
官方有明确的说明:[http://pecl.php.net/account-request.php](http://pecl.php.net/account-request.php)
不过在发起之前请留意:1. 首先你要确保你的扩展的许可:推荐使用PHP3.0.1、BSD或者类Apache许可。2. 你的扩展是否已经有个类似的实现了?如果有人也实现了,社区可能不太会认同。
## Composer[]()
从目前来看,目前很少有人维护pear的库了,和ruby社区的gem比起来太过冷清了。目前一个新起之秀: [http://getcomposer.org/](http://getcomposer.org/) Composer表现不俗,目前绝大多数的PHP开源项目都是用composer来进行包管理,所以你如果有开源库的话,也推荐使用composer。
## 改进和增加文档[]()
目前PHP的文档还算比较全,不过随着版本的升级可能会有些文档没有跟上,或者有的地方会有错误。PHP目前提供了一个方便的平台来协同维护文档。登陆:[http://edit.php.net](http://edit.php.net)即可对文档进行修改。修改后会有人对修改进行review,如果合适的话会把修改合并进去。
同时手册的中文版本也需要维护,所以如果你感兴趣也可以对文档进行翻译。
如果你有想法,可以参考:[http://marc.info/?l=phpdoc&m=136370213519136&w=2](http://marc.info/?l=phpdoc&m=136370213519136&w=2)
- 第一章 准备工作和背景知识
- 第一节 环境搭建
- 第二节 源码结构、阅读代码方法
- 第三节 常用代码
- 第四节 小结
- 第二章 用户代码的执行
- 第一节 生命周期和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中文手册