2014-09-06 81 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

您可以使用装饰模式。当你有很多类别时,这是常用的方法。