2009-12-16 85 views
3

我一直在PHP 5本地設計一個站點,但遇到了一些我現在需要建議的設計問題。面向對象的設計問題

當前網站有三個功能,每個功能都有一個類。這些特點如下:

  • 一個博客
  • 好友列表
  • 一組圖像

我有一個類爲每個但每班我基本上定義了一個類似的方法是獲取所有[博客|朋友|圖片]。我想知道你們中的任何一個人是否知道如何將這些類減少得更薄,並且可能在所有三個特徵之間通用的一個類對於每個特徵都是相同的所有方法。 (即getAllById($ feature,$ id))。

一個例子功能爲我現有的博客等級如下表所示:

function getBlogsByUserId($userId) { 
    global $db; 
    $blogs = array(); 
    $db->where(array("userId"=>$userId)); 
    $rows = $db->get("blog")->fetch(0); 
    foreach($rows as $row) { 
$blog = new Blog(); 
$blog->id = $row['id']; 
$blog->userId = $row['userId']; 
$blog->content = $row['content']; 
$blogs[] = $blog; 
    } 
return $blogs; 
} 

注:我已經定義我自己的東西,DB類,所以不要擔心。

我已經看過網關設計模式,但還沒有找到解決方案。 我也希望這可以重複使用,所以如果我增加功能到七個或更多,那麼我不會改變很多類。

謝謝, 馬特

回答

1

您可以創建一個名爲,比如說,Model一個父類,像這樣:

abstract class Model { 
    protected static $_featureTable; 

    static public function getAllById($id) { 
    global $db; 
    $items = array(); 
    $db->where(array("userId"=>$userId)); 
    $rows = $db->get(self::$_featureTable)->fetch(0); 
    foreach($rows as $row) { 
     $item = self::getInstance(); 
     $item->setValues($row); 
     $items[] = $item; 
    } 
    return $items; 
    } 

    abstract static protected function getInstance(); 
    abstract protected function setValues($row); 
} 

class Blog extends Model { 
    protected static $_featureTable = 'blogs'; 

    protected static function getInstance() { 
    $self = __CLASS__; 
    return new $self(); 
    } 

    protected function setValues($row) { 
    $this->content = $row['content']; 
    // etc. 
    } 
} 

然後,獲取列表的博客:

$blogs = Blog::getAllById($id); 
+0

我在這裏唯一的問題是,對於$ item-> content = $ row ['content']的東西,這些對於所有的功能都是不同的,例如,圖像類將有一個文件名,其中博客將具有內容。這裏有什麼建議?除此之外,它的所有非常感謝! – phpNutt 2009-12-16 17:33:46

+0

@Matt:根據您的評論更新代碼。請注意setValues()方法的添加。 – 2009-12-16 17:39:59

+0

謝謝盧卡斯! :-) – phpNutt 2009-12-16 21:03:37

1

也許你應該看看一些ORM系統,如DoctrinePropel。這對你的數據庫< - >對象映射有很大的幫助。

而且我知道至少Doctrine支持表的繼承,當然也可以將這個結構映射到一個類層次結構(它使您可以在父類中實現常用方法)。

+0

你能否回答http://stackoverflow.com/questions/9511137/is-the-solution-design-optimal-c-sharp-3-tier? – Lijo 2012-03-01 05:43:27

0

您可以創建一個可參數化的Factory對象/函數。它會集結了「row_to_object」功能和「查詢」對象:

function row_to_blog($row) { 
    return new Blog($row["id"], $row["title"]); 
} 

function create_from_query($query, $row_to_object) { 
    $objects=array(); 
    foreach($row as $db->fetch($query)) { 
     $objects[]=$row_to_object($row); 
    } 
    return $objects; 
} 

$query=new Query("blogs", new Where("userid",$id)); 
$blogs=create_from_query($query, row_to_blog);