待進階的phper 想要通讀一個開源項目源碼,應該研究哪個較好?


通讀的願望是好的,但常常是不現實的。因為代碼不是書,是天書,代碼的邏輯複雜程度,不是你想通讀就可以通讀的,你水平高也不行,真正能「讀」一個項目的方法是用它或者以它為基礎做開發,而且是長期開發。真正能讓你「通」一個項目的必備條件,不是你的意願,技巧,水平,而是時間。

這個問題問了有幾年了吧,我想問作者,你成功了嗎:)通了告訴我們大家一下。

其它回答里提到的項目都是有研究價值的,WordPress,Yii,Symfony,還有現在很流行的Laravel,你要問哪個項目代碼最好?我會對你說,代碼好不好,並不是一個標準答案。更值得問的問題是:

它們各自好在哪裡?

比如WordPress,走了十幾年了,從PHP3時代就開始了,迭代到今天,已經讓世界上接近30%的網站用上了它,忽然有小朋友跳出來說,WordPress代碼爛,連OO都沒有,不值得看。

誰告訴你OO的代碼就一定是好代碼,不OO的代碼就立刻就不好的,開源社區有相當多不OO的流行項目,按照國內不少碼農小朋友的技術價值觀,他們都得哭暈在廁所。

很多時候人不理解或者不願意理解一個東西,是因為知識障,但根本原因,是缺乏想像力。我做了十來年前後端開發,曾經也有很多很死的觀念,覺得不怎麼樣就不行,但到今天,讓我去看很多系統的代碼,我不看他們用沒用OO,我看它用得怎麼樣。我職業生涯碰到最爛的代碼,就是半吊子程序員寫的OO代碼。

我現在去看WordPress,覺得這個工具真好,我去看它的API,概念簡潔,明確,該幹什麼就是什麼,怎麼調用文檔上清清楚楚,我覺得這真是好軟體,沒有花花腸子,樸實無華的代碼,讓非專業碼農也能拿起來動手就改,有多少項目能做到這一點。

所以你要研究東西,就不要有假設,假設「那個是最好的」,「那個不好」,而要博採眾長,多問問自己「那個怎麼好,好在哪裡」。

「理解」代碼。


個人認為兩個方向

  • 之一:web整體架構類
  • 之二:業務邏輯類

先說web整體架構類

最好的產品就是流行的框架了,推薦Yii,Symfony,ZendFramework,這類結構完整,封裝嚴密,功能完全的web開發框架。在研究這些框架時,你會體會到web中的各項概念。

舉個例子來說,比如你研究的是Yii,你會發現,Yii將cookie的封裝分別放在請求和響應對象上,這會使你更加清楚,cookie需要在請求時從瀏覽器獲取以及需要在響應時設置到瀏覽器端。

而且,除了web上的概念之外,你還可以從優秀的框架中學些到良好的設計方案,設計理念,實現策略等。

再例如,在Yii中,如果需要控制器動作代碼重用,可以使用行為來進行擴展,似的某項公共的操作被注入到控制器中。這個時候,你就可以想到如果出現需要打破結構的功能重用,可以選擇使用注入類的技術來實現。緊接著,你會想,這個注入類的方案是如何實現的呢?經過代碼追蹤,你會發現,使用了面向對象中的Traits機制。這樣就擴展了學習面。

(PS: 使用Yii舉例子的原因,是最近正在發布一些關於Yii的文章,沒別的)

再說說業務邏輯類

所謂的業務邏輯類,就是市面上可以實現某些特定功能的產品了,比如ecshop,phpCMS等。這類產品的特徵是,典型的業務邏輯都已經實現,而且實現的非常好,這樣在你學習代碼的時候,也就順帶著了解了某個方面的典型業務邏輯,知道了在做某件事情時,該做什麼了。

還是例如,如果你學習的是Ecshop,那麼你就會知道典型的商城應該具備的業務邏輯,在碰到類似的功能時,事半功倍。

(PS:這類的產品有很多,你可以可以將眼光放在全球,不要僅僅限於國內,不過國內的產品,你後期使用到的幾率會大寫)

以上任何產品,一定選擇一個就去讀,學習,不要把大量的時間用在選擇上,時間長了,熱情減退,你發現你還沒有正式開始讀,僅僅完成了選擇,那就很遺憾啦!

最後,強烈建議,先將手冊好好通讀2遍,再說其他,一定!


推薦你讀下我們團隊開發的框架已經在其基礎上開發的作品。

框架:zentaophp

產品:zentao, ranzhi, chanzhi

對於市面上的很多框架我們持有不同的觀點,因此我們開發了自己的框架,並在這個框架基礎上實現了多款開源的產品,每款都有幾十個功能模塊,多語言的支持,深度的擴展機制,api調用機制等等。


我覺得thinkphp挺好的


不存在適合所有人的項目,讀的代碼最好是你覺得有意思的,github有很多Trending PHP repositories on GitHub this month · GitHub


最好的研究是寫代碼,作項目,

建議你參與進來,只有足夠的項目經驗才能分辨好壞,經驗不足是分辨不出好壞的.

可以參與我的開源項目

https://git.oschina.net/yiiany/yiiany


根據你打標籤的幾個開源框架,我的個人意見如下:

1. WP:不建議過度鑽研,這個 blog 系統用起來還不錯,還可以做企業站點,只是源碼採用的設計模式比較特別,大量使用全局變數,不能算是一個進階的途徑,如果想研究奇淫巧技,這倒是可以看看的;

2. Discuz!:有研究價值,當然包含了 Discuz 家的其他幾個開源系統,ucenter,uchome 等,學習他的一些多系統整合架構,可以為你提供很多新思路;

3. Yii:建議好好研究,尤其是 Yii2,不論是目錄結構還是 OOP 的設計模式都非常值得學習。缺點就是國內資料不多,需要花點時間;

4. Symfony:使用不多,無法給出客觀意見。


鳥哥曾經有一篇博客談到了進階的php問題。他是這麼說的。學習c語言,操作系統,計算機網路,學一學Java的面向對象思想,Linux,資料庫。夯實基礎,再考慮框架的事情。而不是學習語言基礎就立刻跑去學框架。這樣是本末導致。我覺得他說的很對。

我大概是在去年12月開始學習php。換了工作後正式用上php,一開始ji個月開始是通讀這個官網的文檔,之後又花了兩個月熟讀了包括下面所有評論在內的整個文檔,自詡對php有了一個整體認識。之後開始看資料庫和數據結構(平時工作中需要自己建庫,但是建完老是被其他人懟),花了兩個月看完了資料庫基礎和資料庫系統實現,重新拿起c語言,實現了索引啊,語法樹什麼的。現在總算是對於關係型資料庫有了一定了解。現在在一邊學Python和爬蟲,一邊學習Linux。準備在學習告一段落後,拿起我的老本行,計算機網路。


所有介紹web框架的都是在誤人子弟,php的發展趨勢,正在過度到服務和socket應用,還只會寫網頁寫mvc,不熟悉多層網路協議,多進程/線程模型,*unix,很難再進一步。web框架,核心就兩點路由和緩存,知道原理就OK,且這些用官網的知識都能做一個出來。非常建議題主學習PHP網路編程的繼大成者,workerman或者swoole,你會發現一個新的天地。


現在的營銷號真是越來越沒有下限了。

誰TM說讀源碼上來就要讀Wordpress的,你學跑步先跑馬拉松嗎?

完全可以從小的地方慢慢入手。

比如你平時會用到 json,看不懂C沒關係,json也有純PHP的實現:webmozart/json

還有messagepack:rybakit/msgpack

平時做命令行工具:symfony/console

Laravel的容器:illuminate/container

uuid是怎麼生成的:ramsey/uuid

忘提了,大名鼎鼎的 composer,也是純PHP:composer/composer

這特么都是源碼,就Wordpress是源碼了?就我看Wordpress這源碼的組織結構,大概比模塊化的 Symfony / Laravel 差了不知道多少條街吧(雖然也有時代背景因素)。


在GitHub上有這麼一個倉庫,收集了大量的優秀php項目,根據你自己所從事,找一個研究一下,相比那些大型項目,如Laravel、WordPress,這些「小」項目能夠讓你更容易進階,以後再進入到大型開源項目,也會比較省心

Awesome-PHP


laravel 吧


symfony裡面用了大量java常用的設計模式,如果用來學習的話,我覺得是比較合適等我,雖然很多寫法比較老舊和過於龐大。

laravel是從symfony分離出來的,寫法和技術都比較新。

yaf 和phalcon這種是實際應用的趨勢,php+c,兼顧性能與開發效率,讀些c代碼也是有必要的


如果是為了學習PHP而讀框架代碼,那麼我還是建議你看看比較知名的框架,比如Symfony2, Lavavel, Yii2,但其實每個框架也都不是那麼簡單就能看懂源碼的,你還需要補充設計模式和新語言特性的知識。重要的是學習裡面的思想而不是語言技法。


我覺得不光要研究語言,語言只是個工具罷了,可以試試研究設計模式,伺服器如nginx,資料庫如MySQL,nosql如redis,memcache等等衍生的一切可能用到的技術


其實,讀php源碼應該幫助最大。前提要有一些操作系統和c語言的基礎http://www.php-internals.com/


推薦閱讀:

對於PHP程序初學者來說,有沒有比較好的開源項目適合學習和深入的呢?
相對於別的php框架來說thinkphp有什麼缺點嗎?
面試php工程師出什麼考題好?
Web後台語言的選擇?
什麼開發語言可以替代PHP?

TAG:PHP | WordPress | Discuz! | Yii | Symfony |