允许"双重依赖"是否合适?课程?

时间:2015-01-14 21:51:13

标签: php oop dependency-injection

我目前正在为我的网站构建一个新的“框架”“CMS” - 先前,所有内容都是使用“程序”方法构建的(使用全局变量来防止冗余信息,等等)。吹嘘自己并没有什么可说的。这是我第一次使用“OOP”,所以尽量不要被我可能扭曲的逻辑所吓倒。

我似乎遇到了一些有点粗略的事情。逻辑上(据我所知)它似乎是最好的解决方案,但即便如此,它似乎也不对。

例如,假设我有以下课程:

class BindClass {

  public $DATABASE;
  public $USER;
  function __construct($database,$user) {
    $this->DATABASE = $database;
    $this->USER = $user;
  }

}

$DATABASE是类Database的实例,值$USER是类User的实例:

$database = new Database(); // Database
$user = new User($database); // User Information
$bind = new BindClass($database,$user);

请注意User取决于Database(访问用户信息)以及BindClass取决于UserDatabase的方式。由于User已经包含Database,因此技术上不会是{em>两个 Database的实例。做什么?

这不是达到我想要的结论的正确方法(BindClass能够访问User& Database的'属性',如果是,那么“是什么”正确的方法”?我主要担心的是,我“包含”已经与Database“连接”的东西。

1 个答案:

答案 0 :(得分:1)

TL; DR:您的示例设计完全没问题,事实上它是一个教科书示例,说明在没有关于这些类是什么以及它们究竟是什么的具体信息的情况下应该如何完成事情。应该做的。

  

我主要担心的是,我包括"包括"已经存在的东西   "连接"到数据库。

您的主要关注点应该是确保准确地涉及每个类,并将其依赖关系及其预期的公共接口传达给外部世界。

如果Database等类真的需要某些User的服务才能为其客户提供服务,那么Database应该采用UserInterface的实例(它的很多更好地使用接口而不是具体类型)作为依赖,例如通过要求该类型的构造函数参数。

完全独立于上述内容,如果DatabaseUser之类的内容暴露给其客户以便更好地实现其预期功能,则完全独立于此表示给它一个返回UserInterface实例的公共方法(再次,比具体类型好得多,尽管在这种情况下我们讨论的是phpdoc注释,因为语言不能根据返回值的类型强制实施限制) 。如果Database的作业不是为其客户提供User,那么它一定不在乎它已经有User并且那些客户可能想要为了自己的目的得到一个。

请注意,此处没有User的两个实例,只有两个引用到同一个实例 - 没有开销。但是如果你想出于某种原因(单元测试是一种非常常见的情况)那么你可以有两个实例,如果你BindClass拉{{1}那么这是不可能做到的User之外的。{/ p>