首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >面向对象设计问题

面向对象设计问题
EN

Stack Overflow用户
提问于 2009-12-16 16:55:35
回答 3查看 315关注 0票数 4

我在PHP 5中设计了一个本地站点,但遇到了一些设计问题,我现在想听听建议。

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

  • 博客
  • 朋友名单
  • 一组图像

我为每个类都有一个类,但是在每个类中,我基本上都定义了一个类似的方法,获取所有的博客、朋友、朋友、图片。我想知道你们中是否有人知道如何将这些类简化为更细的类,并且可能有一个类在所有方法之间都是通用的,对于每个特性都是相同的。( getAllById($feature,$id))。

下面是我现有博客类的一个示例函数:

代码语言:javascript
复制
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定义了自己的类,所以不要担心。

我看过网关设计模式,但还没有找到解决方案。我也希望它是可重用的,所以如果我将特性增加到7个或更多,那么我就不需要更改类的很多内容了。

谢谢,马特

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-16 17:15:59

您可以创建一个名为Model的父类,如下所示:

代码语言:javascript
复制
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.
  }
}

然后,获取博客列表:

代码语言:javascript
复制
$blogs = Blog::getAllById($id);
票数 1
EN

Stack Overflow用户

发布于 2009-12-16 17:05:16

也许您应该看看一些奥姆系统,如教条推进。这将对数据库<->对象映射有很大帮助。

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

票数 1
EN

Stack Overflow用户

发布于 2009-12-16 17:09:55

您可以创建一个参数化工厂对象/函数。它将聚合一个'row_to_object‘函数和一个’查询‘对象:

代码语言:javascript
复制
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 );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1916051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档