程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP面向對象編程的7個好習慣(1)

PHP面向對象編程的7個好習慣(1)

編輯:關於PHP編程

在PHP編程早期,PHP 代碼在本質上是限於面向過程的。過程代碼的特征在於使用過程構建應用程序塊。過程通過允許過程之間的調用提供某種程度的重用。

但是,沒有面向對象的語言構造,程序員仍然可以把 OO 特性引入到 PHP 代碼中。這樣做有點困難並且會使代碼難於閱讀,因為它是混合范例(含有偽 OO 設計的過程語言)。使用 PHP 代碼中的OO構造 — 例如能夠定義和使用類、能夠構建使用繼承的類之間的關系以及能夠定義接口 — 可以更輕松地構建符合優秀 OO 實踐的代碼。

雖然沒有過多模塊化的純過程設計運行得很好,但是 OO 設計的優點表現在維護上。由於典型應用程序的大部分生命周期都花費在維護上,因此代碼維護是應用程序生命周期的重要部分。並且在開發過程中代碼維護很容易被遺忘。如果在應用程序開發和部署方面存在競爭,那麼長期可維護性可能被放在比較次要的地位。

模塊化 — 優秀 OO 設計的主要特性之一 — 可以幫助完成這樣的維護。模塊化將幫助封裝更改,這樣可以隨著時間的推移更輕松地擴展和修改應用程序。

總的來說,雖然構建 OO 軟件的習慣不止 7 個,但是遵循這裡的 7 個習慣可以使代碼符合基本 OO 設計標准。它們將為您提供更牢固的基礎,在此基礎之上建立更多 OO 習慣並構建可輕松維護與擴展的軟件。這些習慣針對模塊化的幾個主要特性。有關獨立於語言的 OO 設計優點的更多信息,請參閱 參考資料。

7 個優秀PHP OO 習慣包括:

◆保持謙虛。
◆做個好鄰居。
◆避免看到美杜莎。
◆利用最弱的鏈接。
◆您是橡皮;我是膠水。
◆限制傳播。
◆考慮使用模式。

保持謙虛

保持謙虛指避免在類實現和函數實現中暴露自己。隱藏您的信息是一項基本習慣。如果不能養成隱藏實現細節的習慣,那麼將很難養成任何其他習慣。信息隱藏也稱為封裝。

直接公開公共字段是一個壞習慣的原因有很多,最重要的原因是讓您在實現更改中沒有應有的選擇。使用 OO 概念隔離更改,而封裝在確保所作更改在本質上不是病毒性(viral)更改方面扮演不可或缺的角色。病毒性 更改是開始時很小的更改 — 如將保存三個元素的數組更改為一個只包含兩個元素的數組。突然,您發現需要更改越來越多的代碼以適應本應十分微不足道的更改。

開始隱藏信息的一種簡單方法是保持字段私有並且用公共訪問方法公開這些字段,就像家中的窗戶一樣。並沒有讓整面牆都朝外部開放,而只打開一兩扇窗戶(我將在 “好習慣:使用公共訪問方法” 中介紹訪問方法的更多信息)。

除了允許您的實現隱藏在更改之後外,使用公共訪問方法而非直接公開字段將允許您在基本實現的基礎上進行構建,方法為覆蓋訪問方法的實現以執行略微不同於父方法的行為。它還允許您構建一個抽象實現,從而使實際實現委托給覆蓋基本實現的類。

壞習慣:公開公共字段

在清單 1 的壞代碼示例中,Person 對象的字段被直接公開為公共字段而非使用訪問方法。雖然此行為十分誘人,尤其對於輕量級數據對象來說更是如此,但是它將對您提出限制。

◆清單 1. 公開公共字段的壞習慣

<?phpclass Person{ public $prefix;
public $givenName; public $familyName;
public $suffix;}$person = new Person();$person->prefix = 
"Mr.";$person->givenName = "John";echo
($person->prefix);echo($person->givenName);?>

如果對象有任何更改,則使用該對象的所有代碼也都需要更改。例如,如果某人的教名、姓氏和其他名字被封裝到 PersonName 對象中,則需要修改所有代碼以適應更改。

好習慣:使用公共訪問方法

通過使用優秀的 OO 習慣(參見清單 2),同一個對象現在擁有私有字段而非公共字段,並且通過稱為訪問方法 的 get 和 set 公共方法謹慎地向外界公開私有字段。這些訪問方法現在提供了一種從 PHP 類中獲取信息的公共方法,這樣在實現發生更改時,更改使用類的所有代碼的需求很可能變小。

◆清單 2. 使用公共訪問方法的好習慣

<?phpclass Person{ private $prefix;private $givenName; 
private $familyName; private $suffix;public function setPrefix($prefix)
{$this->prefix = $prefix; }public function getPrefix()
{ return $this->prefix;}
public function setGivenName($gn){$this->givenName = $gn;}
public function getGivenName() {return $this->givenName;}
public function setFamilyName($fn){$this->familyName = $fn;}
public function getFamilyName() {return $this->familyName;}
public function setSuffix($suffix){$this->suffix = $suffix;}
public function getSuffix() { return $suffix;} }$person = new Person();
$person->setPrefix("Mr.");$person->setGivenName("John");echo
($person->getPrefix());echo($person->getGivenName());?>

乍看之下,這段代碼可能會完成大量工作,並且實際上可能更多是在前端的工作。但是,通常,使用優秀的 OO 習慣從長遠來看十分劃算,因為將極大地鞏固未來更改。

在清單 3 中所示的代碼版本中,我已經更改了內部實現以使用名稱部件的關聯數組。比較理想的情況是,我希望擁有錯誤處理並且更仔細地檢查元素是否存在,但是本例的目的在於展示使用我的類的代碼無需更改的程度 — 代碼並沒有察覺到類發生更改。記住采用 OO 習慣的原因是要謹慎封裝更改,這樣代碼將更具有可擴展性並且更容易維護。

1

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved