现在我已经阅读了很多关于oop、mvc和设计模式的文章、问答,我仍然对构建我想要构建的东西的最佳方式有疑问。
我的小框架是以mvc的方式构建的。它使用smarty作为查看器,我将一个类设置为从url调用的控制器。
现在我想我迷路的地方是在模型部分。我可能将模型和类/对象混合到很多(或很少)。
总之是个例子。当目标是获取驻留在我的数据库中的用户列表时:
应用程序由例如“users/list”调用控制器然后运行函数列表,该函数列表打开类“user”的实例并请求该类从表中检索列表。一旦返回到控制器,控制器通过将结果集(数组)分配给模板并设置模板将其推送到查看器。
然后,用户将单击表中的一行,该行将告诉控制程序启动“用户/编辑”例如-这将反过来创建一个表单,并用要编辑的用户数据填充该表单。
到现在为止,一直都还不错。
现在,我将所有这些合并到一个用户类中,这样这个类就有一个函数create、getmealistofusers、update等以及hairtype和nosesize等属性。
但是,正确的oop设计需要我将“user”(具有登录名、大鼻子、卷发等属性)与“getme a list of users”分开,这更像是一个“user manager类”。
如果我要实现一个用户管理器类,那应该是什么样子的呢?它应该是一个对象(不能与真实世界的对象进行真正的比较),还是应该是一个只包含公共函数的类,这样它或多或少看起来像一组函数。
它应该返回一个已找到记录的数组(如:array([0]=>array("firstname"=>"dirk", "lastname"=>"diggler"))
还是返回一个对象数组)。
所有这些对我来说还是有点困惑,我想知道是否有人能给我一点关于如何以最好的方式解决这个问题的见解。
最佳答案
我不是这方面的专家,但最近做了几乎完全相同的事情。我设置它的方式是一个类用于多行(Users
)和一个类用于一行(User
)。“多行类”基本上只是(静态)函数的集合,它们用于从表中检索行,如下所示:
$fiveLatestUsers = Users::getByDate(5);
返回一个用户对象数组。然后,每个用户对象都有检索表中字段的方法(如
$user->getUsername()
或$user->getEmail()
等)。我以前只返回一个关联数组,但在返回数据之前,您会遇到一些需要修改数据的情况,在这些情况下,为每个字段都有一个带方法的类是很有意义的。编辑:对象还有更新和删除当前行的方法;
$user->setUsername('Gandalf');
$user->save();
$user->delete();