【发布时间】:2017-10-29 02:22:45
【问题描述】:
我是 php 中 OOP 编程的新手,并试图在我的 MVC 项目中理解和实现依赖注入功能。在下文中,我将解释一个超级简单的示例,说明我正在努力应用依赖注入的功能。实际的应用程序比这复杂得多,但是,这应该足以证明我遇到的问题。
我创建了一个名为“user”的模型,负责管理单个用户。类处理的数据(关于用户的数据)也保存在数据库表中。 “用户”类具有从数据库表加载和保存/更新数据的方法。可以使用从数据库加载的数据(通过使用用户 ID)或从提供给构造函数的数组加载来启动用户类。
该项目一次处理多个用户。因此,我创建了一个名为“users”的容器类。这个类有一个“用户”对象数组。但是,这个类也有方法从数据库中加载多个用户对象的数据(基于所有付费用户等标准),然后用数据创建对象数组。创建对象的数量取决于从数据库返回的用户数量。
以下是类的示例代码
class user
{
private $data;
function __construct ($arData=””)
{
$this->dbTable ="user";
if(!is_array($ar))
{
if($ar!="")
{
$ar = $this->getDataFromDB($ar);
}
else
{
$ar = array();
}
}
$this->data = $ar;
}
function getDataFromDB($id_user){ … data base implementation … }
....
Other methods
....
}
class users // the container class
{
private $objUsers;
function __ construct(){
$this->objUsers = array();
}
function loadUsers($type){
$userDataArray = $this->getUsersFromDatabase($type);
foreach($useDataArray as $userData){
$this->objUsers[] = new user($userData);
}
}
function getUsersFromDatabase($userType) { …… database …… }
…… other methods …..
}
我关心的是容器类(容器可能不是正确的说法)。我想知道创建这种类型的容器类的最佳实践以及对此的建议。此外,很明显这个容器类与“用户”类紧密耦合,不能单独测试。如何为这样的类实现依赖注入?
【问题讨论】:
-
您将使
users更通用,并打破您与用户类中的数据库的任何紧密耦合。有几种方法可以做到这一点,但大多数都很难看,这真的取决于你是否打算将此容器用于其他任何用途。我有相反的情况,我从不直接调用user,而是创建用户并通过users类加载它们,该类返回user对象、用户对象数组或其他一些数据。 -
所以我的一个快速示例不是去
new User($data)我做$Users->createUser($data)并且用户与数据库没有连接,它只是一组定义/包装数据库表数据的属性。换句话说,用户只对数据负责,用户负责获取和创建一个用户或一组用户。如果这是有道理的。 -
也就是说,我认为这不是依赖注入的好用例,主要原因是您通常不会拥有多种类型的用户,您可能具有权限级别等,但是用户始终是用户。没有太大的需要进行这种级别的分离,一些 PPL 可能不同意,但我不喜欢为了编码而编码。所以基本上做依赖注入,为了做它,当真的不需要的时候。鞋子合不合脚。
-
感谢@ArtisticPhoenix。我喜欢你的方法。
-
当然,请始终牢记给定类应该关注的内容。你可以限制的越多,你的代码就越容易维护和简单。
标签: php arrays oop dependency-injection containers