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类的数组。
好的,一种解决方案是工厂模式,我将参数发送给父类,它会为我的数组实例化适当的类。这个问题有没有更好的(更简单的)解决方案?也许完全不同的方法。
确实是一个装饰者模式,如Phpdna所述。工厂模式是创建的,并且不适用,因为您需要在运行时返回类别的复合数据类型 – Coldstar 2014-10-28 06:25:39