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