面向对象的设计问题

时间:2009-12-16 16:55:35

标签: php design-patterns oop gateway

我一直在PHP 5本地设计一个网站,但是现在遇到了一些我想要的设计问题。

目前网站有三个功能,每个功能都有一个类。这些功能如下:

  • 博客
  • 朋友列表
  • 一组图片

我有一个类,但在每个类中我基本上定义了一个类似的方法来获取所有[blogs |朋友|图片]。我想知道你们中是否有人知道如何将这些类减少得更薄,并且可能有一个类在所有三个特征之间是通用的,对于每个特征都是相同的。 (即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;
}

注意:我已经为数据库内容定义了自己的类,所以不用担心。

我看过网关设计模式,但还没有找到解决方案。 我也希望这可以重复使用,所以如果我将这些功能增加到七个或更多,那么我就不必改变课程的大部分内容。

谢谢, 马特

3 个答案:

答案 0 :(得分:1)

也许您应该查看一些ORM系统,例如DoctrinePropel。这将对您的数据库提供很多帮助< - >对象映射。

我知道至少Doctrine支持表的继承,当然也将这个结构映射到类层次结构(这使您能够在父类中实现常用方法)。

答案 1 :(得分: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);

答案 2 :(得分:0)

您可以创建可参数化的Factory对象/函数。它会聚合'row_to_object'函数和'query'对象:

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 );