Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
共享类别表与PHP OOP方法_Php_Design Patterns_Mysqli - Fatal编程技术网

共享类别表与PHP OOP方法

共享类别表与PHP OOP方法,php,design-patterns,mysqli,Php,Design Patterns,Mysqli,我有以下数据库表,用于存储不同类型的类别(查找代码)。在这里,不同的类别共享同一个数据库表,并通过cattype列进行区分 catid|catname|catvalue|cattype -----+-------+--------+------- 1 Adult 100 Age 2 Child 200 Age 3 Black 150 Hair 4 Blond 220 Hair 现在我将这个DB表映射到扩

我有以下数据库表,用于存储不同类型的类别(查找代码)。在这里,不同的类别共享同一个数据库表,并通过cattype列进行区分

catid|catname|catvalue|cattype
-----+-------+--------+-------
1     Adult   100      Age
2     Child   200      Age
3     Black   150      Hair
4     Blond   220      Hair  
现在我将这个DB表映射到扩展基本DAO类数据库(提供DB连接等($DB))的基本DAO类:

每个特定类别都有自己的类别:

// 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()返回的是Category而不是AgeCategory类型的年龄笼!如何避免这个问题?我想要回AgeCography类的数组


好的,一个解决方案是工厂模式,我将参数发送到父类,它将为我的数组实例化适当的类。这个问题有更好(更简单)的解决方案吗?可能是完全不同的方法。

您可以使用装饰图案。当您有很多类别时,这是一种常见的方法。

事实上,正如Phpdna所述,这是一种装饰模式。工厂模式是创造性的,不会应用,因为您需要在运行时返回类别的复合数据类型
$AgeCategory=new $AgeCategory()
$AgeCategories=$AgeCategory->getAll();

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