我在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定义了自己的类,所以不要担心。
我看过网关设计模式,但还没有找到解决方案。我也希望它是可重用的,所以如果我将特性增加到7个或更多,那么我就不需要更改类的很多内容了。
谢谢,马特
发布于 2009-12-16 17:15:59
您可以创建一个名为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-16 17:05:16
也许您应该看看一些奥姆系统,如教条或推进。这将对数据库<->对象映射有很大帮助。
我知道至少Doctrine支持表的继承,当然,这个结构也映射到一个类层次结构(它使您能够在父类中实现公共方法)。
发布于 2009-12-16 17:09:55
您可以创建一个参数化工厂对象/函数。它将聚合一个'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 );https://stackoverflow.com/questions/1916051
复制相似问题