2011-01-13 60 views
5

我想提高我對PHP中OOP的知識,並一直在研究抽象類和接口。PHP的高級OOP功能的真實世界示例

我學到

  • 它們是不能被實例化本身,而是可以olny擴展
  • 抽象類爲其他類的方法和屬性(在接口的情況下實現的)兩類這擴大了他們。
  • 如果一個類使用抽象方法,那麼類本身也必須是抽象的。
  • 如果在抽象類中定義抽象方法,則所有子類都必須定義該方法的詳細信息。未定義爲抽象的方法可以與普通方法相同的方式使用。
  • 接口定義實現它的類必須具有的方法。方法的功能沒有在接口中定義,接口只提供了一個必須包含在子類中的方法列表。
  • 接口沒有定義任何屬性。
  • 類可以實現多個接口,因爲他們想,但他們必須定義接口的每一個他們實現

的方法我認爲,涵蓋了基礎知識。請隨時補充,如果你認爲有什麼我錯過了。

我想知道的是,如果有任何現實世界的例子實現這些類,特別是接口類。有沒有人知道任何使用它們的開源應用程序,我可以瀏覽它們以更好地瞭解它們並查看它們何時何地有效使用?我遇到了使用動物的書籍例子,這些例子沒有證明這些課程的重要性。

回答

1

這不是一個現實世界的例子,但是一個你經常遇到接口和抽象類的設計模式是Command Pattern。請參閱示例代碼的鏈接。一般來說,「針對接口編程」被認爲是很好的OO實踐,因爲它解耦了具體的實現,並讓你更容易地改變它們以用於其他實現,例如,而不是要求一個特定的類

public function fn(ConcreteClass $obj) 
{ 
    $obj->doSomething() 
} 

你剛纔問的是它提供了一組特定的方法

public function fn(MyInterface $obj) 
{ 
    $obj->doSomething() 
} 

接口也幫助戲弄除了大量繼承結構。由於PHP只支持單一繼承,你會經常看到的層次結構是這樣的:

BaseClass -> Logger -> Auth -> User 

其中每個這些包含這些類中使用特定方面。一個接口,你只是做

User implements Loggable, Authenticable 

,然後包括通過策略模式或合成/聚合,這是最終更容易維護特定代碼。

對於PHP中預定義接口列表,請參閱我的回答:

2

PHP自帶的默認predefinded幾個接口:http://www.php.net/manual/en/reserved.interfaces.php

PHP還包含標準PHP庫(SPL),它定義了更多:

Zend Framework也是很好的例子,其中這樣的概念是 用過的。 http://framework.zend.com/

+0

此外,ZF2正在進行維基工作:http://framework.zend.com/wiki/display/ZFDEV2 – joksnet 2011-01-13 10:24:12

+0

@戈登:例如看看那個:http://www.php.net/manual/en /class.splheap.php – vartec 2011-01-13 14:58:21

0

我們可以說接口純粹是100%抽象類,但抽象並不是。因爲很多時候我們在抽象類中定義函數。但是在接口類中,我們總是聲明函數。

class Parent 
{ 
} 

class Mother extends Parent 
{ 
} 

final class Brother extends Mother /* - This class cannot be extended - */ 
{ 
} 

class Pet extends Brother 
{ 
} 

寵物類將拋出一個錯誤,指出:

1

final關鍵字防止類的其他類,例如正在擴大Fatal error: Class Pet may not inherit from final class (Brother)

這也適用於方法,因此,如果你這樣做不希望允許繼承方法導致子類具有相同的方法作爲覆蓋。

http://php.net/manual/en/language.oop5.final.php

喲用你想要的一些真實世界的例子哪些接口可用於,以及數據庫抽象層

你有1個基類,它提供了基本的方法來遍歷數據庫數據,但是會爲數據庫類型使用子類,如MySql,MsSql等,每種數據庫類型都有它自己的類,但是爲了確保基類具有這些方法,它們都將實現相同的類接口。

interface IDatabaseLayer 
{ 
    public function connect(); 
    public function query(); 
    public function sanitize(); 
    //... 
} 

所以基類知道MySQL和MSSQL有上述方法,從而減少錯誤和爲更有條理。

將對象傳遞給類時,如果要確保對象具有某種類型,則PHP5允許您定義應將哪些類型的對象作爲參數傳遞給方法。

可以說你有3類

  • DatabaseCredentials
  • DatabaseConnection
  • DatabaseQuery

你可以在DatabaseConnection,你需要一個DatabaseCredentials類,像這樣的constructuin具體界定:

class DatabaseConnection implements Connectable 
{ 
    public function __construct(DatabaseCredentials $ConnectionDetails) 
    { 
     $this->Connect($ConnectionDetails->BuildDSN()); 
    } 
} 

的一個好方法真正開始是通過閱讀這裏:


您不妨看看PHP5的另一個特點是名稱空間,這將允許你保持你的代碼有組織,有多個對象具有相同的名稱,使自動加載更有效

小示例:

namespace Database\MySql 
{ 
    class Database{} 
} 

namespace Database\MsSql 
{ 
    class Database{} 
} 

,你可以直接使用,如:

use Database; 
$Database = new MySql\Database(); 
1

您可以在his blog按照"PHP patterns" series由喬治西羅尼在dzone或直接,真的很有趣,如果你有興趣的模式和OOP。

如果你需要一本好的PHP書,你也可以看看在012over在stackoverflow。