為什麼要選擇 CodeIgniter PHP Framework?

CodeIgniter
大家一定會有疑問,在眾多 PHP Framework 選擇下,我為什麼要推廣 CodeIgniter 這套呢?寫這篇的原因就是我在腦殘 PHP 部落格看到了這篇:Codeigniter是萬靈丹?,底下針對此作者寫的內容做一些回應
在最近幾次去面試的過程 或是和朋友聊天聊到framework 都發現了一個問題 許多完完全全不懂framework的人一直在談論它的好 也發現了有很多基本PHP程式設計基礎都不好的人都在用它 連台灣在推廣它的人都把它尊奉為神….
看完上面的內容,我實在很想知道,有哪些推廣 CI 的人,把 CI 尊奉為神?如果有的話,可以介紹認識認識。不知道此部落格作者有沒有深入想過,為什麼這些人會覺得 CI 非常好用和 CI 的好處在哪裡?至少在我聽到的大部都是覺得 容易上手及架構清楚,光是這樣就足以讓一些基礎的人可以快速上手這套 Framework。
在某個推廣它的blog看到 有人問了為什麼我用codeigniter使用 $this->input->post(“user”); user是空值時,為什麼我存入資料庫會是填0? 於是推廣它的人很好心的看了原始碼 發現codeigniter是這樣處理的 $this->input->post(“user”); 為空值時會回傳FALSE,然後在database的函式庫內會將bool轉為0 所以就建議了發問者,應該要多增加判斷式,為FALSE時應該回傳NULL 相信有人看到這兒應該覺得我倒底在唸什麼…… 明說了!這個根本是一個大BUG!非常大的BUG 如果在這個情形之下的話! 正確的處理方式是$this->input->post(‘user’); 要嘛就是丟出exception或者是回傳NULL 根本不應該回傳FLASE啊! 這個應該對它提出質疑並修正它才對啊……
看完上面這段,你應該是看到之前我寫的這篇 深入探討 CodeIgniter Input Class 核心程式流程 教學,不過個人認為這不是一個 Bug,當使用者在欄位裡面沒有輸入任何值,系統會回傳 FALSE,這是沒有問題的,我想你應該是對於資料庫把此值轉為 0 有疑慮,為什麼資料庫會將資料轉為 0 呢?答案當然是欄位型態不同,所以資料庫跟轉換了,那為什麼不在寫入資料庫之前把所有變數轉換成符合欄位型態的格式呢?
$data = array(
    "user_id" => (int) $this->input->get_post("user_id"),
    "user_name" => (string) $this->input->get_post("user_name"),
    "user_company" => (string) $this->input->get_post("user_company"),
);
這樣是不是可以解決問題,還可以增加資料的正確及安全性,至少在國外 PHP 各大 open source 專案都是這樣在開發程式了。欄位是 string 就傳入 string 型態,布林型態就傳入布林型態。當欄位為空值時,CI 回傳 False,將 False 丟入到 int 欄位,資料庫當然會將此資料轉成 0,那你說這是 Bug 還是個人程式設計上面的疏失呢?如果您覺得這是 Bug 的話,那何不貢獻您的 Patch 提交到 CodeIgniter Github 上,而不是抱怨官方應該修正,才能符合您的期待。
所以framework是萬靈丹嗎? 當然不是,它的核心精神祇是協助你加速開發程式而已! 最主要的還是你本身的程式設計基礎… 大家千萬別忽略了真正重要的事…..
最後一段說的非常好,Framework 核心精神就是加速開發程式,以及避免讓開發者在程式設計設面出現錯誤,至少安全性上面 Framework 都做的很好,當然這只是一個工具,工具需要大量的開發者去測試,以及回報貢獻 Patch,以利官方可以思考及掌握未來的 Road map。當然使用此工具之前,最好是對於 PHP 有一些程式的基礎,這樣學習起來會更快,這也是今年在台北 PHP 第一屆 Conference 我所講得 快速上手 – CodeIgniter 的前幾張 Slide。會推廣這套的原因,也只是單純希望台灣在 Web 領域可以有更多人接觸 Framework 這種程式架構,不管是不是 PHP 都是一樣,而我只是推薦大家比較簡單的架構,之後也許跳到其它 Framework 的時候,或許就可以減少很多摸索時間。
  • tsai recca

    Sorry…
    用詞可能過於激烈..此篇也不是針對你

    供奉framework的真正涵意為它不是絕對,就算是在用framework也必須對它抱有一定的疑問….

    僅此而已…如有不敬,請見諒囉…

  • tsai recca

    純論討!筆戰不是一件好事

    bug這個問題…database將boolean轉為0或1沒有存在任何的疑問…有疑問的是無值時為什麼要回傳 false!這才是我的疑問點…如果有寫過其他程式語言,對變數一定要給初始化,或指定型態照常理來說!要嘛是給空字串或者是null這樣程式上才不會造成問題…(這是PHP的便利的地方,也是不便的地方)至於我要不要提交到codeigniter上的github我已經不再使用codeigniter所以…..

  • Anonymous

    Hi 一直都是純討論,而不是筆戰

    你不是自己也講出解答了嗎?

    引用:

    “如果有寫過其他程式語言,對變數一定要給初始化,或指定型態照常理來說!要嘛是給空字串或者是null這樣程式上才不會造成問題”

    所以我在文章寫了

    (string) $this->input->get_post(“user_name”)

    不就是您要的,對變數初始化+指定型態,所以當你有做到這樣,對於 CI 回傳是否是 False 對程式有任何影響嗎?

  • tsai recca

    這樣回答你好了!

    當接受$_POST或$_GET或$_REQUEST的這三個外部參數來看參數內容預期的結果是字串…(不論是java、c#….的語言只要是外部參數全部都是字串,進到程式後再做適當的轉換)

    (string) $this->input->get_post(“user_name”);

    萬一做這個型態轉換時它內容值變為0呢?(php版本眾多,這個情形是可能發生的)

    回傳FALSE或者是NULL或者是空字串有沒有影響?

    答案是一定有 畢竟 空字串 並不等於 falseif (“” === false){}else{}

  • tsai recca

    (相信你寫了那麼多的程式語言,應該對外部參數傳進程式的處理方式應該相當了解才是。)

  • tsai recca

    再回到原點

    如果以這個問題來看不用framework程式寫法可能為
    if (empty($_POST[‘user_name’]) == FALSE){
        $user_name = $_POST[‘user_name’];
    }else{    $user_name = “”;
    }
    不太可能會這樣寫
    if (empty($_POST[‘user_name’]) == FALSE){    $temp = $_POST[‘user_name’];}else{    $temp = FALSE;}
    $user_name = (string) $temp;
    不曉得你能不能接受我這個觀點….

  • Anonymous

    我想重點是取決於您的資料表欄位的型態,既然你都說 $_POST 或 $_GET 或 $_REQUEST 傳進來結果是字串,這是最原始的 PHP 寫法,可是您目前使用了 CodeIgniter 了不是嗎?CI 在這部份是有做處理的,User Guide 也寫的很清楚,既然你不 Follow 他的方法,那就自己開發這部份吧?而不是說這是 CI 的 Bug,不是嗎?

    http://codeigniter.com/user_guide/libraries/input.html

    另外可否你舉例

    “萬一做這個型態轉換時它內容值變為0呢?(php版本眾多,這個情形是可能發生的)”

    請針對 PHP 版本 5.1.6 以上做測試,因為 CI 支援 PHP 5.1.6 版本以上

  • 路人甲

    我覺得這是 php 的特性
    php 內建function的return
    很多都是沒結果可回傳的,就傳回 FALSE

    使用時,最好是習慣用 === FALSE 去判斷
    (有時,還真的很討厭這種 weak type)

  • Fred Chien

    雖然我沒用過 CI,但也用過一些 Framework 和寫過不少種語言。

    看到兩位的討論後,平心而論,這部份不能稱做 Bug ,但我覺得可以算是『設計』上的問題。

    每一個 Function 在 Return 時,應該保持單一的型態,才比較不會造成問題或理解上的錯誤。

    想想看,要是每一個 Function 都可能有兩種型態以上的回傳值,那就難搞了。

    所以,無論在哪一種語言的開發上,保持『型態』單一性是最好的做法。

    不過,也許因為 PHP 本身是弱型態的語言,才會有 CI 這樣的設計或是本文對應這樣設計的 Workaround。

    我認為,一般寫自己的程式,可以只求能動就好。但如果身為 Framework,因為有太多人的程式建構在上面,應該是要做較嚴謹設計才是。

  • tsai recca

    這是我最後一天在這兒討論這件事情….

    這篇文章有個地方我希望,能尊重一下我個人的文章內容
    我文章內容,你沒問過我就直接po上來這邊…

    有點欠缺妥當…..

    不論我的文章是否攻擊你!

  • chchwy Chang

    其實我不太懂你這兩個程式片段有什麼明顯差別,各有什麼好壞? 可以請你解釋一下嗎?

  • tsai recca

    是不是bug這件事實在是見仁見智…

    或許是我的論點有點偏頗…

    如您說的也有可能是所謂『設計』上的問題…

    但在容我描述一次這次討論問題真正所在…例如傳了一個參數進程式內…

    估且為這個變數命名為abc好了

    但我的程式內取用的變數並為def

    example:
    URL:
    localhost/test.php?abc=123

    CODE:
    $abc = $_GET[‘def’];

    在這個情形下不管任何一個程式語言來看

    都應該丟出Exception

    在此例內framework可以說是很貼心!但也算粗心

    會自動判斷是否變數存在,不存在時自動回應false

    真正的問題到此為止

    至於接下來型態的變化!其實並不在我所討論的範圍之內

    畢竟我不是專業的部落客,

    文字表達上可能有失禮儀,

    或者容易模糊了焦點….

    我自己的部落格從頭到尾都是給自己或者是給自己朋友的『提醒文』
    僅此而已…

  • tsai recca

    我用不用codeigniter並不是重點…

    如果有使用codeigniter 

    我會自行extend input自己把那一段程式做適度的修改

    以利自己使用,

    framework的宗旨是加速程式開發

    如果每段程式碼都要這麼寫

    $data = array(“username”=> ($username)?$username:NULL,
    “username2″=> ($username2)?$username2:NULL,);

    實在是造成程式開發上的負擔

    抱歉你的原文並不是本文所寫的(string) $this->input->get_post(“user_name”);

    你要我舉出實例實在是太過於….

    程式會不會出問題取決的因素過多了!不只是php版本的問題

    可能是php版本問題,可能是作業系統問題,可能是硬體問題

    誇張一點連power都可能造成程式出問題

    要我舉例…..

    我實在不想聞雞起舞…

    真正應該要提倡的是怎麼讓程式『可能』發生bug的機會減少

    能夠宣告它為boolean就為boolean值

    儘量不要讓它能成為兩種型態才是要點….

    到此為止……..

  • tsai recca

    兩段執行結果並無差別…

    只是第二段我是模擬framework內程式碼再寫一次
    讓人選擇會用第一種寫法或者是第二種寫法罷了…

    嚴格上如果要說差別的話,

    就是變數型態的問題了!

    如果預期的結果是string,

    何必指定它為boolean再強制轉回string呢?如果以這個觀點來看的話!

    Fred Chien所說的

    這個是設計上的問題不是bug

    也完全是一個很好的答案…

  • tsai recca

    假設連return都沒有

    又剛好它是weak type

    所以在它的定義上

    undefined、0、’0’、false

    這4個東西都叫false

    很好用!也很令人很頭痛啊….

    唯一的解決也就真的只有 ===

  • 這是合理引用

  • Pingback: PHP Framework – CodeIgniter « Abner’s Postgraduate Days()

  • 部盧斯阿

    空值用isset,empty判斷不就好了嗎??

  • wewwewewe

    fuck u