2011-06-25 183 views
3

我仍在學習如何使用類,我想知道什麼時候應該使用關鍵字extends(擴展一個類)。擴展PHP類

比方說,我有一個類,做事情A(而且它是一個單身人士)。即使B類與A類並不真正相關,但是它使用了很多方法,可以將它擴展到另一個B類嗎?或者我應該創建一個新班級?

+0

你能解釋一下在什麼情況下你需要擴展單例類嗎?也許還有其他設計方法...你聽說過依賴注入模式嗎? –

回答

0

例如,如果要通過這兩個類訪問私有變量,則應該使用擴展。 如果你能展示你的作品,我們可以告訴你你應該做什麼/不應該做什麼。

+0

這真的是很多代碼:)基本上A類是網站的核心。它從數據庫中獲取文章(數據庫有自己的類),並在屏幕上顯示模板等。B類爲邊欄創建內容(類似於WordPress中的Widget) – Alex

+0

你是否認爲你需要擴展A級B級? – genesis

+0

我不確定。但我認爲從'B調用類的方法'''this-> do_stuff()'而不是'A :: getInstance() - > do_stuff()'看起來更好 – Alex

4

在面向對象編程中,如果一個類是具有更多特定用途的該類的特殊類型,則它通常應該擴展另一個類。

例子:class自行車擴展汽車

不好的例子:汽車類擴展自行車(可以共享類似的方法,但是這並沒有真正意義)

2

確保您創建一個新的靜態成員,用於存儲單例實例並超載getInstance()方法。如果不是,那麼即使您致電B::getinstance(),您也將最終訪問A實例,因爲這兩個類都只有一個靜態成員。

5

當談到面向對象的編程時,通常一個類會執行特定的任務,如保存用戶信息或輸入/輸出控制。

當我們說1個用於控制輸出的對象時,您可以在該對象中設置一個方法來控制輸出類型,或者應該如何處理每個特定內容,但這意味着對象唯一的目的已經被打破,因爲它現在不僅僅是發送內容,而且還根據其類型來操縱內容。

中,我們使用了過來,這是通過將一組任務的成團的類/對象,例如一個辦法:

abstract class Output 
{ 
    public $content_type = 'text/plain'; 

    public function _send(){} 
} 

輸出類顯然有更多的方法,但僅方法有關ouputting內容,如頭部等,而不是內容的操作,那麼你會碰到這樣的:

class HTMLOutput extends Output 
{ 
    public $content_type = 'text/html'; 
} 

和內容的操作:

class CSSOutput extends Output 
{ 
    public $content_type = 'text/css'; 

    public _send() 
    { 
     if($_SERVER['APP']['Settings']['CSSCompress'] == '1') 
     { 
      $this->_compress_css(); 
     } 

     parent::_send(); 
    } 

    private function _compress_css() 
    { 
     $this->content = ; //Some compression lib 
    } 
} 

這是我在創建和組織許多分組的類/對象時遵守的主要體系結構要點。