CodeIgniter在今年4月出了第三版。
我在Facebook、批踢踢至今沒看到有人撰文批評它,我覺得這樣不對。
要跟全世界的PHP工程師競爭,只學習CodeIgniter是不夠的。
CodeIgniter不是一個現代框架。必須有人指出這點。
CodeIgniter 3的釋出
這則新聞第一時間就在Reddit出現:
得分最高的評論如下:
是怎樣的被虐狂才會想在2015年用CodeIgniter來開發專案啊?沒有namespaces,沒有autoloading,沒有composer!我乾脆投河自盡好了。
這則評論看起來很偏激嗎?但它拿到最高評論可不只是因為搞笑。
CodeIgniter不是一個現代框架。它沒跟上PHP的幾個趨勢。
怎樣算是現代PHP框架?
現代框架沒有正式定義,但我認為至少要具備三點:
- 符合PHP元件推薦規範(PHP Standard Recommendations)
- 支援Composer套件管理
- 提供成熟的測試環境
為什麼要有這三點才算是現代框架?
因為它們解決了PHP社群幾年來的三個大問題:
- 一盤散沙的社群
- 四散的套件
- web需要軟體測試
一盤散沙的社群
不像Ruby社群,大家全力貢獻在Rails。
PHP社群四散各地、同一個功能在不同框架被重複開發、
框架間難以使用彼此的元件、不同社群難以使用其他社群開發的套件。
這樣的現象在近年終於獲得改善:各框架派出了幾位代表,大家協商出一套coding convention。
從此有了PHP框架互用性小組,制定了PHP元件推薦規範。
以後若想要開發新框架,可以從現有的框架中拿幾個元件來組合著用。
PSR規範中對於namespace有清楚的規範,
而CodeIgniter 3中還是到處充滿CI_Controller、CI_Model這種過時的前綴字(prefix)寫法。
四散的套件
在開發套件的時候,PHP有元老級的PEAR、CodeIgniter的Sparks、
Laravel的Bundles、Zend Framework 2的Modules、CakePHP的Bakery。
這種現象是整個PHP社群的損失:PHP社群如此龐大,但是大家各搞各的,心力無法集中。
所幸,Composer的出現解決了這點。
現在大家都開發Composer套件了,整個PHP社群開始共享彼此的成果。
套件相依性的問題也在Composer一併解決,大幅加速了開發的速度與軟體的品質。
CodeIgniter 3還是沒直接支援Composer。
你還是要寫:
$this->load->library('xxx');
之類的囉唆東西。
web需要軟體測試
隨著web application越來越複雜、架構越來越龐大,
軟體測試開始成為web圈的討論重點。
軟體測試不但協助設計架構,確保軟體品質,還能協助重構。
web社群已經從「測試要寫很多很多」爭吵到「測試過多沒意義,足夠就好」。
DHH在2012年已經開始主張「測試覆蓋率不要追求100%」、
「code和測試的比例超過1比2就是出問題」
他在2014年更進一步論述「測試先行已死」
TDD is dead. Long live testing.
PHP近年總算有了PHPUnit廣泛出現在各框架,大幅改善了測試環境。
而CodeIgniter呢?連像樣的基本測試都做不到。
結論
CodeIgniter的主要contributor,Phil Sturgeon,在2012年就曾經貼文闡述
「CodeIgniter不重寫就做不到的5件事」:
5 Things CodeIgniter Cannot Do (without a rewrite)
原文我就不翻譯了。他指出的五個缺失如下:
- 自動載入
- 命名空間
- 資料庫結構抽象化
- 單元測試
- migration機制
綜合以上,我的結論就是:
要跟全世界的PHP工程師競爭,只學習CodeIgniter是不夠的。
CodeIgniter不是一個現代框架。
Q&A
Q1: 我耳聞Composer很久了,但到底怎麼入門呢?
Q2: 我暫時不可能離開CodeIgniter,有什麼辦法嘗試軟體測試?
CI 2曾經有人把simpletest整合進去。不知道CI 3做不做得到就是了。
Q3: CodeIgniter也許是有些小缺點,但真有那麼落後嗎?
我在2014年2月曾經寫信詢問Phil Sturgeon意見。他的答覆如下:
Hey Tony,
(上略)
我不會再理CodeIgniter了,它玩完了。試試看Laravel吧,然後看一下這些短片:
你會學到很多:)
—
Phil Sturgeon
原文
Hey Tony,
You definitely don’t want to rate yourself based on your own age and ability. I’m 25 and there are lot of people around who are younger and smarter, or older and smarter, and more successful. I rate myself based on my improvements over time, and as long as I’m always learning then I’m always getting better.
I’d ignore CodeIgniter completely, its done. Try getting into Laravel, and watch these screencasts:
https://laracasts.com/
You’ll learn a lot 🙂
—
Phil Sturgeon