既然你在閱讀本書,那說明你也是對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中文手冊