資料來源:http://php.igt.com.tw/unit_111.htm
PHP 支援物件導向程式設計,雖然就純粹的物件導向程式設計的觀點來看,它的支援並不是很完整,但是,只要我們遵循良好的程式設計習慣,我們還是可以善用 PHP ,來開發物件導向的程式。
為什麼要使用物件導向的程式設計?
在 物件導向程式設計的觀念提出之前,軟體開發者,大多是使用結構化的程式設計。所謂結構化的程式設計,就是把問題切割成各個比較小的問題,比較小的問題,如 果還是複雜到無法以一個函式來解決時,就在切割成為更小的問題。直到可以用一個單一的函式來解決為止。每個函式處理個別的功能,主程式藉由呼叫各個函式, 來完成他的工作。
課程111:物件導向程式設計 |
摘要:
在這個課程中,我們將討論物件導向程式設計。首先,我們討論物件導向程式設計的觀念。接著,我們以實例來示範 PHP 物件導向程式設計的撰寫。然後,再把物件導向程式設計的方法,應用在留言版的程式中。 |
物件導向程式設計觀念 |
PHP 支援物件導向程式設計,雖然就純粹的物件導向程式設計的觀點來看,它的支援並不是很完整,但是,只要我們遵循良好的程式設計習慣,我們還是可以善用 PHP ,來開發物件導向的程式。 為什麼要使用物件導向的程式設計? 在 物件導向程式設計的觀念提出之前,軟體開發者,大多是使用結構化的程式設計。所謂結構化的程式設計,就是把問題切割成各個比較小的問題,比較小的問題,如 果還是複雜到無法以一個函式來解決時,就在切割成為更小的問題。直到可以用一個單一的函式來解決為止。每個函式處理個別的功能,主程式藉由呼叫各個函式, 來完成他的工作。 在前一個課程函式的應用, 我們應用了結構化的程式設計,將留言版的功能分割成各個函式,各網頁藉由呼叫各函式的方式,完成存取留言版資料的工作。使用結構化的程式設計,的確簡化了 我們撰寫程式的工作,也提高了程式的可維護性。但是,結構化程式設計在開發大型專案時,還是無可避免的碰到了他的瓶頸。因為,結構化的程式設計,專注於功 能面(函式)的開發,而往往忽略了功能所要處理的資料。被處理的資料與功能在結構化的程式設計是分離的關係。在大型專案的開發上,由於要處理的問題,相對 的要複雜許多,如果,資料與函式之間沒有關聯性,很容易發生錯誤,維護起來也很不方便。後來,物件導向程式設計的興起,就是為了解決,結構化程式設計所面 臨的資料與功能分離的問題。 物件導向程式設計的常用名詞:
物件導向程式設計的支柱 物件導向程式設計的三大支柱,稱之為 PIE(Polymorphism多變, Inheritance繼承, Encapulation封裝)。由於,PHP目前的版本只支援繼承及封裝,所以,我們在此,僅討論繼承與封裝。 所 謂封裝,就是把功能與資料包裝起來成為一個物件,並定義物件的介面。讓外界的程式,透過物件所提供的介面,來與這個物件溝通。外界的使用者,無須知道,物 件內部如何執行他的作業。只需要知道,如何使用物件的介面,來完成自己的工作即可。所以,設計物件的開發者,日後要更新物件的程式時,只要維持物件的介面 不變,便可以確保,使用這物件的外部程式,不需要改寫,一樣可以執行。而外界程式的開發者,只要遵循不直接存取物件內部的功能及資料,僅透過介面來使用物 件的規則,便可以確保程式執行無誤。 所謂繼承,就是子類別藉由繼承父類別的方式,取得父類別所定義的屬性及方法。通常,父類別會定義通用的屬性及方法,而子類別則延伸父類別定義特定的屬性及方法,以解決特定的問題。 如何使用物件導向程式設計來開發程式 使 用物件導向的方式來開發程式,最主要的關鍵,在於程式設計觀念的改變。之前,我們使用函式來開發留言版的時候,我們著重在於找出留言版應該具有的功能,然 後,按照功能來撰寫對應的函式。外界的網頁程式,把資料餵給這些功能,來完成它的工作。使用物件導向程式設計時,我們必須把程式所企圖解決的問題,看做是 一個獨立的個體。在這個個體中,包含了它應該處理的資料,以及處理這些資料的功能。這些功能是為了處理這些資料所產生的。所以,在撰寫留言版的程式時,我 們要把留言版當作是一個自給自足的個體。把程式所要解決的問題,定義成為個別的個體,這個過程稱之為抽象化(Abstraction)。 當 我們的腦子裡,有了這個個體所需要的資料以及功能後,我們就可以專注於定義這個個體的類別。把個體的資料,定義成類別的屬性;把個體的功能,定義成類別的 方法。在定義類別時,先別管外界的程式如何運作,全心全力專注於如何按照這個個體的需求,寫好這個類別。類別定義完之後,外界的程式,便可藉由物件變數, 來使用這個我們定義的類別(使用者定義的資料型態)。物件導向程式設計,名稱上雖然是物件,但是,實際上,程式設計師大部分的心力,在於找出問題中的個 體,定義這個個體的類別。使用這類別的程式部分,反而花的時間不多。 在下一節中,我們將使用實際的例子,來實作 PHP的物件導向程式設計。
|
PHP 物件導向程式設計實例演練 |
說明: 在這一節中,我們使用範例,來學習如何撰寫類別:
|
一、類別的語法結構 |
class 類別名稱 [extends][父類別名稱]{
} |
說明:
|
二、封裝:定義屬性及方法。 |
class 類別名稱 [extends][父類別名稱]{
} |
說明:
|
範例:定義類別 |
<?php function Dog(){ function Eat(){ |
三、使用物件:類別的實例化。 |
// 產生物件時 // 呼叫物件方法或存取屬性時 |
說明:
|
範例:使用物件 |
程式碼: <?php // 產生 Dog 類別的物件 |
執行程式 |
四、繼承 |
說明:
|
範例:繼承 |
程式碼: <?php class Pet{ function Pet(){ function Eat(){ function Speak(){ class Dog extends Pet{ class Cat extends Pet{ function showFear(){ <?php // 產生 Dog 類別的物件 |
執行程式 |
將物件導向程式設計應用在留言版的資料庫網頁 |
說明: 在這一節當中,我們將把物件導向程式設計,應用在留言版的網頁程式中。 我們按照以下的步驟,來修改留言版的程式:
|
一、準備工作 |
說明: 將之前110課程所做好的PHP程式,放在另一個新的目錄 guestbook111 之下。然後,在網站的根目錄底下,建立一個 inc 的目錄。存放網站整體各項設定的檔案,以及存取資料庫物件的父類別檔案。 |
複製檔案: |
|
二、產生網站設定檔:web_config.php |
說明: 在 web_config.php 中,我們定義一些有關整體網站各含括目錄所需的參數,以及存取資料庫的設定,方便網站的管理者,日後修改網站的設定。 |
程式碼: <?php // 定義網站目錄的設定 // 定義資料庫的設定 |
三、產生資料庫類別檔:db.php |
說明: 在 db.php 檔案中,我們定義存取資料庫的父類別,供網站中所有需要存取資料庫的類別繼承之用。在這個類別中,我們定義了資料庫連線及選用資料庫的方法 init()。同時,我們也擷取出存取資料庫的通用功能,分別依照功能定義成各種方法。透過繼承這個父類別,其他子類別就可繼承父類別的方法,無須再個別 定義存取資料庫的方法。子類別只需定義,個別類別所需的特定功能。這樣子的做法,一來,減輕修改程式的負擔,提高整個網站程式的維護便利性。二來,要新增 其他類似的資料庫網頁時,可以透過繼承父類別的方式,減少程式碼的撰寫,提高程式開發的效率。 |
程式碼: <?php class DB{ function DB(){ function init(){ function Add(){ function Update(){ function Delete(){ function Select(){ function Retrieve(){ |
四、產生應用程式設定檔:app_config.php |
說明: app_config.php 這個檔案,定義了有關留言版所有網頁程式的設定。其他留言版的網頁,只需含括這個檔案,便可以使用定義好的各種設定。 藉由使用目錄來存放各相關子系統的方式,可以讓我們網站的功能模組化,日後需要增減功能時,只要新增或刪除目錄即可。在各目錄中,放置個別的 app_config.php 檔,來負責個別子系統的環境設定。這樣可以提昇各模組的可攜性,方便網站程式開發的管理。 |
程式碼: <?php // 含括網站設定檔 web_config.php |
五、產生留言版類別檔:Guestbook.php |
說明: Guestbook.php,定義了留言版所需要使用的類別 Guestbook。Guestbook類別藉由繼承父類別 DB,取得了存取資料庫的通用功能。所以,在這個類別,只要定義專屬於留言版的各種屬性及功能即可。 |
程式碼: <?php // 藉由含括子系統的設定檔,取得網站及子系統的各種設定 // 含括父類別 db.php class Guestbook extends DB{ // 類別的建構方法 // setSQL 方法定義存取資料表所需的各個 SQL 命令 |
六、修改原本的程式: index.php, add.php, update.php, delete.php |
說明: 在這裡,我們含括 Guestbook.php檔案。藉由產生 Guestbook的物件 $obj,按照各網頁程式所需要的功能, 透過 $obj物件,呼叫Guestbook所定義及繼承的各個方法。 |
index.php |
add.php |
update.php |
delete.php |
執行程式 |