[心得] 淺聊物件導向在 PHP 中的觀念和應用 # 1

看板PHP作者 (銀色)時間14年前 (2011/07/30 18:28), 編輯推噓6(602)
留言8則, 7人參與, 最新討論串1/1
將文章從原本那篇中抽取出來,是因為這系列淺聊, 是寫給所有想嘗試將物件導向概念應用在自己程式裡的板友, 這些文章當中所提及的程式碼只是單純一個入門階,重點還是觀念, 有興趣的板友可以在自己的程式或專案裡來思考或應用這些觀念 如果文章裡有任何觀念上的謬誤或需要補充的地方, 也請板友們不吝指教。感謝。 -- 在小弟的經驗裡,很多 phper 對於物件一直感到很疑惑, 物件類別的宣告並不難理解,但應用上卻很難想像。 其實物件比較合適的應用方式會涉及物件導向本身的特性, 但這部份可以晚點說明(太理論性了),我們盡量用簡單的例子來談。 情況: 如果手上有一個案子,其中某個部份是有關資料的顯示處理, 資料是可能會由一個結構簡單的 DB Table 中取得, ※ id / name 但是最後要輸出的可能形式包括: 下拉式選單(select)、列表、單選按鈕(radio)三種 在一般性的思考上,我們很可能會建立三個 function: function output_select ($data) function output_list ($data) function output_radio ($data) 三個 function 各自代表了某種輸出的實做, 而允許輸入的參數是 mysql_fetch_* 所取出的資料集合, 但如果今天突然增加一個限制條件, name 當中 sexy 為字首的部份顯示時必須要濾掉, 並且再增加一個控制條件, 表示當 id 小於 100 的是系統管理者,要在 name 前面加上 admin 那在這個思考點上的延伸很可能是增加第四、五個 function: function data_remove_sexy ($data) function data_check_add_admin ($data) 而我們使用上會是: $data = mysql_fetch_* ($sql); $data = data_remove_sexy ($data); $data = data_check_add_admin ($data); output_select ($data); 注意到哪邊很有趣了嗎? yap,這五個 function 實際上在處理的都是同一筆資料 $data, 我們可以思考如何嘗試用更結構化的方式來達成這件事。 類別設計的本身具有一個最強大的特性讓它成為可以承擔物件導向的一切核心, 那就是「物件內部自我資料處理的能力」, 如果僅僅將類別當作一種儲存方式來使用那是極為浪費的行為(並不是說不行), 因為這會將物件貶低到跟 array 或 hash table 一樣的價值層次裡, 也就是儲存複數資料的能力。 如果真的 class 在宣告後只是從外部餵給它變數, 那 class 和 hash table 也就只有語法撰寫上的差異而已了。 回到類別,如果我們試著把上面這個例子類別化,可以粗略得到以下的程式: class dataHandler { var $_data = Array (); function __construct ($data) { $this->_data = $data; $this->data_remove_sexy (); $this->data_check_add_admin (); } function data_remove_sexy () {} function data_check_add_admin () {} function output_select () {} function output_list () {} function output_radio () {} } 仔細看過我們可以發現,幾乎所有的函式(方法)都不需要額外的參數, 因為它們都已經成為這個類別(物件)的一部分,可以直接使用物件內部的資料。 這個類別在使用上大致可以像以下: $data = mysql_fetch_* ($sql); $dh = new dataHandler ($data); $dh->output_select (); 當然你可能會說,我也可以在每個 output_* 裡加上那兩個函式來節省重複的部份, 這樣使用起來和類別也就差不多了啊? 但是仔細想想,當我們需要擴充更多的前提條件或更多的輸出方法時, function 和 class 哪個處理起來會更容易(包括容易實做與理解)? 除此之外,當你朋友遇到一個相同的需求時, 你可以直接把這個 class 交給他,然後告訴他: 「只需要 new 出物件,並且把 $data 餵進去,中間的它都會幫你處理好。」 這就是物件導向三大特性中 - 封裝的一部分含意。 有沒有一種很熟悉的感覺? 其實當我們在使用別人已經做好的擴充類別時,也都會享受到封裝特性的優點, 也就是類別實際上達成了黑箱化的作業,隱匿去了使用者不需知道的細節, 而我們只要專注在類別本身的操作和使用上即可。 -- 夭壽…寫東西真的超慢,三大特性只約略提了一個, 看之後有沒有空繼續 follow 吧…囧 其實真正要體驗到 oo 的精髓,一定要試著去理解設計模式, 如果有足夠的時間小弟再慢慢聊吧… -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.45.241.224 ※ 編輯: gpmm 來自: 114.45.241.224 (07/30 18:30)

07/30 18:52, , 1F
好文!
07/30 18:52, 1F

07/30 22:53, , 2F
好文
07/30 22:53, 2F

07/30 23:41, , 3F
推這篇.... 我一開始就是學c#那種非常物件化的語法,結果去
07/30 23:41, 3F

07/30 23:41, , 4F
學PHP就覺得很卡....
07/30 23:41, 4F

07/31 10:11, , 5F
有c的基礎,在切入php會比較快.
07/31 10:11, 5F

08/02 10:44, , 6F
yep...
08/02 10:44, 6F

08/04 21:43, , 7F
對由c轉向php的在下而言,這篇文章是不可多得的好物!
08/04 21:43, 7F

10/02 01:47, , 8F
推!
10/02 01:47, 8F
文章代碼(AID): #1ECzonDE (PHP)
文章代碼(AID): #1ECzonDE (PHP)