2012-02-08 56 views
0

我有一個存儲人員和公司的MySQL表。他們有相同的領域。在php中我有用於創建子類對象實例的設計模式

class User{ 
var $_id; 
var $_data; 
function loadDataFromDb() 
{ 
} 
} 

class Company extends User 
{ 
    function getName() 
    { 
    //some implemantation 
    } 
} 


class People extends User 
{ 
function getName() 
{ 
//some implemantation 
} 
} 

什麼是創建對象的最佳方式。當我創建我的對象時,我不知道哪種類型的客戶端。

我需要這樣的東西:

$user = /* code missing */ 
$user->getName(); // this will trigger the appropiate method.` 
+1

公司如何擴展用戶? – PeeHaa 2012-02-08 17:58:00

+0

問題是,我可以在從MySQL加載數據之後決定哪種類型的用戶。另外我想將這些數據作爲對象的私有數據。不會有User()對象。只有公司或人員。用戶是People和公司的母公司的通用名稱。你可以說Client()。 – catalinux 2012-02-08 18:27:30

回答

1

我覺得工廠方法將適用於本案,因爲這工廠會給你你正在尋找的對象。
您必須傳遞某種信息才能讓工廠決定返回哪個對象。

+0

我會說有關對象類型的信息以某種方式存儲在數據庫中,所以2個給定的字段可能不是表的唯一字段,工廠方法可以讀取它。 – Stan 2012-02-08 18:07:44

+0

問題是,我可以在從MySQL加載數據之後決定哪種類型的用戶。另外我想將這些數據作爲對象的私有數據。不會有User()對象。只有公司或人 – catalinux 2012-02-08 18:26:51

0

你如何使用ORM像Doctrine這樣的工作。它支持繼承,所以你可以將它映射到你的數據庫模式(這應該是Doctrine中的具體繼承類策略)。

否則,請嘗試在此澄清您的目標和具體問題。

+0

你有沒有在學說中的例子?我在2周前開始在其他項目中使用教條和任何提示都很好 – catalinux 2012-02-08 18:24:15

+0

有很多很好的在線文檔: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference /inheritance-mapping.html – 2012-02-09 07:14:41

1

抽象工廠模式:

interface AbstractUserFactory{ 
    public function buildUser($type); 
} 

class UserFactory implements AbstractUserFactory { 
    public function buildUser($type='user'){ 
     if($type == 'user'){ 
      return new User(); 
     } else if ($type == 'company') { 
      return new Company(); 
     } else if($type == 'people') { 
      return new People(); 
     } else{ 
      throw new Exception("Unknown User type [$type]"); 
     } 
    } 

}