2014-09-06 46 views
0

我有以下數據庫表用於存儲不同類型的類別(查找代碼)。這裏不同的類別共享相同的數據庫表,並通過cattype列進行區分。共享類別表和PHP OOP方法

catid|catname|catvalue|cattype 
-----+-------+--------+------- 
1  Adult 100  Age 
2  Child 200  Age 
3  Black 150  Hair 
4  Blond 220  Hair 

現在我這個數據庫表映射到延伸基本DAO類數據庫(它提供數據庫連接等($ DB))的基礎DAO類:

abstract class Category extends DataBase 
{ 
    public catid; 
    public catname; 
    public catvalue; 

    protected function getAll($cattype) 
    { 
    $sql="SELECT catid,catname,catvalue FROM categories WHERE cattype='$cattype'"; 
    $rst=$this->db->query($sql); 
    while($row=$rst->fetch_assoc()) 
    { 
     $Category=new Category() 
     foreach($row as $key=>$val) $Category->$key=$val; //fill variables from row 
     $Categories[]=$Category; 
    } 
    return $Categories; 
    } 
} 

每一個特定的類別都有它自己的類:

// Returns age categories from 'categoris' table 

class AgeCategory extends Category 
{ 
    public function getAll() 
    { 
    return parent::getAll('Age'); 
    } 
    public function getSomething() {}; 
} 


// Returns hair categories from 'categoris' table 

class HairCategory extends Category 
{ 
    public function getAll() 
    { 
    return parent::getAll('Hair'); 
    } 
    public function getSomething() {}; 
} 

這裏的問題是,子類的函數getAll()返回類型爲Category的父對象的數組。當我遍歷所有子對象,如:

$AgeCategory=new $AgeCategory() 
$AgeCategories=$AgeCategory->getAll(); 

foreach($AgeCategories as $AgeCategory) 
{ 
    $cat=$AgeCategory->getSomething() //IT DOES NOT WORK!!! 
} 

我不能叫getSomething()函數,因爲它是自$ AgeCategory-> GETALL()返回的類型分類不AgeCategory年齡cagetories孩子的目標函數!如何避免這個問題?我想要返回AgeCategory類的數組。

好的,一種解決方案是工廠模式,我將參數發送給父類,它會爲我的數組實例化適當的類。這個問題有沒有更好的(更簡單的)解決方案?也許完全不同的方法。

+0

確實是一個裝飾者模式,如Phpdna所述。工廠模式是創建的,並且不適用,因爲您需要在運行時返回類別的複合數據類型 – Coldstar 2014-10-28 06:25:39

回答

1

您可以使用裝飾模式。當你有很多類別時,這是常用的方法。