既然你在阅读本书,那说明你也是对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)