4

我一直在使用 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;
}

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

我查看了网关设计模式,但还没有找到解决方案。我还希望它是可重用的,所以如果我将功能增加到七个或更多,那么我就不必更改太多的类。

谢谢,马特

4

3 回答 3

1

也许你应该看看一些ORM系统,比如DoctrinePropel。这将对您的数据库 <-> 对象映射有很大帮助。

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

于 2009-12-16T17:05:16.457 回答
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);
于 2009-12-16T17:15:59.817 回答
0

您可以创建一个可参数化的工厂对象/函数。它将聚合一个“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 );
于 2009-12-16T17:09:55.090 回答