2012-10-31 122 views
1

我正在使用幾個簡單的類來處理PHP項目。我正在努力讓我的課變得更加複雜,但我也想開始使用類來管理用戶,配置設置,顯示等其他內容。我很難想出如何「組織」他們。就像我應該如何擴展這些類?在PHP項目中組織/擴展類

我有以下類別:

//main application settings, constants, etc. 
Class Config { 
} 

//add/edit/delete/check permissions of users 
Class Users extends Config { 
} 

//displays the pages 
Class Display extends Config { 
} 

//main application 
Class Analysis extends Config { 
} 

//specific methods for this type of analysis 
Class Standard extends Analysis { 
} 

//specific methods for this type of analysis 
Class Consolidated extends Analysis { 
} 

我遇到的問題是我希望能夠從所有其他類(顯示,分析,標準和統一訪問用戶和配置類)。我將如何做到這一點?我是否正確地擴展了這些類?我覺得顯示和分析應該擴展用戶,但對我來說似乎並不合適。我很感激您可以提供的任何幫助。謝謝!

+0

您使用的是哪個版本的PHP? '5.4'或'<5.4' – Baba

+0

我正在使用PHP版本5.4。 – Jeff

回答

1

在我的項目中,我的用戶和配置類是singleton classes,它允許我通過一個簡單的方法調用輕鬆地將實例拉入任何其他類。

Class User{ 
    private static $_instance; 

    private function __construct(){ 
    } 

    public function getInstance(){ 
     if(!self::$_instance){ 
      self::$_instance = new User(); 
     } 

     return self::$_instance; 
    } 
} 

那麼無論我需要訪問用戶對象

$user = User::getInstance(); 
+0

對於最後一部分,你將如何從你的一個類中引用它? – Jeff

+0

以相同的方式從任何地方,包括其他類,因爲您正在使用靜態方法來實例化對象,並且它是一個單例,您將始終獲得相同的對象,而不是實例化一個新對象。 –

0

讓他們在不同的文件中,然後使用自動加載。避免OOP瘋狂的傾向。請記住,類可以被引用爲屬性,而不僅僅是在擴展方法中。

1

您可以嘗試

trait Config { 
} 

// Common to Display 
abstract class Display { 
    function __construct(Users $user); 
} 

// Common to analysis 
abstract class Analysis { 

    function __construct(Users $user); 
} 

// add/edit/delete/check permissions of users 
class Users { 
    use Config ; 
} 

// Mobile Display 
class Mobile extends Display { 
} 

// Web Display 
class Web extends Display { 
} 

// specific methods for this type of analysis 
class Standard extends Analysis { 
} 

// specific methods for this type of analysis 
class Consolidated extends Analysis { 
} 

// main application 
class Main { 
    use Config ; 
    public function setDisplay(Display $display); 
    public function setAnalysis(Analysis $analysis); 
} 

$user = new Users("Jeff"); 
$main = new Main(); 
$main->setDisplay(new Mobile($user)); 
$main->setAnalysis(new Standard($user)); 
+0

感謝您的示例!我現在如何訪問Analysis和Display類中的方法?我會使用$ main->方法嗎? – Jeff

+0

它可以是http://pastebin.com/SM53hWRZ或類似的東西http://pastebin.com/cunpS6is – Baba

0

根據經驗,一般情況下,你可以使用「is-a」的原則來組織你的類層次結構。對於你的描述,它看起來像:

  • StandardConsolidated是(在是,一個感)Analysis,所以它看起來像一個很好的候選人的層次結構。
  • UserDisplay需要訪問Config值,但它們在概念上似乎並不相關,也沒有共同的行爲,所以它看起來組合比繼承更適合。

關於是,一個原則上,你通常會認識到,它不會在你的子類繼承不屬於它的行爲符合。因此,例如,如果您的Config類擁有saveValuesToDB(),它肯定看起來像User不應該關心的東西(即配置值如何存儲在數據庫中)。您可以通過搜索繼承與組合找到關於此主題的大量信息,並且是模式社區中反覆出現的主題。你可以找到一些關於OO設計和圖案的好書的列表here

HTH