2009-12-16 87 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);