codeigniter-logo

CodeIgniter不是一個現代框架

CodeIgniter在今年4月出了第三版。

我在Facebook、批踢踢至今沒看到有人撰文批評它,我覺得這樣不對。

要跟全世界的PHP工程師競爭,只學習CodeIgniter是不夠的。

CodeIgniter不是一個現代框架。必須有人指出這點。

CodeIgniter 3的釋出

這則新聞第一時間就在Reddit出現:

Codeigniter 3 is out

得分最高的評論如下:

是怎樣的被虐狂才會想在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。

你還是要寫:

之類的囉唆東西。

web需要軟體測試

隨著web application越來越複雜、架構越來越龐大,

軟體測試開始成為web圈的討論重點。

軟體測試不但協助設計架構,確保軟體品質,還能協助重構。

web社群已經從「測試要寫很多很多」爭吵到「測試過多沒意義,足夠就好」。

DHH在2012年已經開始主張「測試覆蓋率不要追求100%」、

「code和測試的比例超過1比2就是出問題」

Testing like the TSA

他在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很久了,但到底怎麼入門呢?

COMPOSER設計原理與基本用法

COMPOSER進階原理:PHP命名空間與PSR-0


Q2: 我暫時不可能離開CodeIgniter,有什麼辦法嘗試軟體測試?

CI 2曾經有人把simpletest整合進去。不知道CI 3做不做得到就是了。

CodeIgniter with SimpleTest


Q3: CodeIgniter也許是有些小缺點,但真有那麼落後嗎?

我在2014年2月曾經寫信詢問Phil Sturgeon意見。他的答覆如下:

Hey Tony,

(上略)

我不會再理CodeIgniter了,它玩完了。試試看Laravel吧,然後看一下這些短片:

https://laracasts.com/

你會學到很多:)


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


社群看法

PHP台灣

  • zx1986

    大大對 yii 2 的看法如何?

    • 尤川豪

      不好意思,我沒有用過yii 2,無法給你完整答覆

      但是就我文章提到的三點

      * yii 2有參加PHP-FIG
      * yii 2有支援composer
      * yii 2有整合Codeception

      看起來非常出色

      • zx1986

        收到!
        其實我剛開始上手 MVC 是透過 CodeIgniter 1.x
        覺得 CI 拿來體驗 MVC 還挺不錯,
        就是 …. 大部份東西都得自己動作做,
        哈哈!

  • 阿軟

    請問: Composer有沒有可能掛點? 若是在重要時間發現Composer 無法運行,那網站還可以有備行方案裝載其相關套件嗎?

    • 尤川豪

      HI, 雖然機率不高, 但確實有機會掛點,導致無法更新。

      不過composer有local裝載功能,像是classmap, files, 等等都是,所以還是有辦法裝的。

      我自己是直接把composer的vendor資料夾放進git裡面一併紀錄…不好意思我只知道這個偏方。

      另外,這個好像也是一個方法?

      https://github.com/composer/satis

  • Shin

    CodeIgniter的好處在於輕量快速… 它載入所需要的RAM 不到 1.5 MB ,相較之下其它 Framework 你可以測試。而且你這麼這麼執著 Namespace 呢,難到你不知道可以直接 include 嗎?CodeIgniter 又沒逼你用它的方法載入 library @@
    你不知道你用 WordPress 載入一頁就吃掉 16 MB 的記憶體嗎?XD

    • stanly liu

      你知道的太多了

  • 張匡瑋

    寫程式不是炫技 是解決問題的
    CodeIgniter好處就是輕量簡單 快速結案 要添加功能方便

    你所謂的 自動載入,命名空間,資料庫結構抽象化,單元測試,migration機制
    只要你基本功夠熟 花不了你多少時間就能實作了

    而且自動載入 migration機制CodeIgniter本來就有實作了
    CodeIgniter 要支援Composer也不用多寫你三四行code
    資料庫結構抽象化? 我真心覺得Laravel的Eloquent沒好用到哪

    要說Laravel對我的吸引力就是社群豐富 很多現成套件可用
    Dependency Injection的寫法很酷炫 看了source code讓我感到敬佩

    但.. 只要你基本功夠熟
    那些套件也不過就改幾行code就能套到CodeIgniter
    CodeIgniter要用Eloquent跟實作Dependency Injection也不過就composer install把套件整進去稍微加工一下而已

    比起Laravel一開始就包山包海好像很猛..
    輕量快速的CodeIgniter不好用嗎? 不見得吧
    沒有必要因為你的偏見否定一個框架

    • alanchang15

      就是

    • Joseph Chong

      當你要自己改動/實作很多東西才能做成別人用1,2句就能做好的事,我就覺得這工具不能好好解決問題,要知道開發最花錢的不是硬體,而是工資

  • Pepein Lin

    這篇文章有年代了,ci 3.1.2 已經完全具備上面所有功能,且還保持著效能快速與簡潔易用,比之包山海的laravel的複雜,清爽多了!

    且走php7的ci 4 也將面世了。

    • Joseph Chong

      然後到現在別說CI4了,CI3.2到現在還不能出來