我一直在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;
}
注意:我已经为数据库内容定义了自己的类,所以不用担心。
我看过网关设计模式,但还没有找到解决方案。 我也希望这可以重复使用,所以如果我将这些功能增加到七个或更多,那么我就不必改变课程的大部分内容。
谢谢, 马特
答案 0 :(得分:1)
也许您应该查看一些ORM系统,例如Doctrine或Propel。这将对您的数据库提供很多帮助< - >对象映射。
我知道至少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 );