为 类 允许 "double dependency" 是否合适?

Is it proper to allow "double dependency" for classes?

我目前正在为我的站点构建一个新的 "framework" "CMS" - 之前,所有内容都是使用 "procedural" 方法(使用全局变量来防止冗余信息等)。这真的没有什么值得吹嘘的。这是我第一次与 "OOP" 一起工作,所以请不要被我可能扭曲的逻辑吓到。

我似乎 运行 有点粗略。从逻辑上讲(据我所知)它似乎是最好的解决方案,但即便如此它似乎也不正确。

例如,假设我有以下 class:

class BindClass {

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

}

$DATABASE是classDatabase的实例,值$USER是class[=17=的实例]:

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

注意 User 如何依赖于 Database(访问用户信息),以及 BindClass 如何依赖于 UserDatabase。由于 User 已经包含 Database,所以从技术上讲,这不是 两个 Database 实例吗?

这不是达到我想要的结论的正确方法吗(BindClass 能够访问 UserDatabase 的 'properties'),如果是这样, "right way" 是什么?我主要担心的是我 "including" 已经是 "connected" 到 Database

TL;DR: 你的示例设计非常好,实际上它是一个教科书示例,说明在没有关于这些内容的具体信息的情况下应该如何做 classes 是什么,他们应该做什么。

My main concern is that I'm "including" something that already is "connected" to Database.

您的主要关注点应该是确保每个 classes 都准确地参与并传达其依赖关系及其与外界的预期 public 接口。

如果class如Database确实需要一些User的服务来为自己的客户提供服务,那么Database应该采用一个实例UserInterfacemuch 更好地使用接口而不是具体类型)作为依赖项,例如需要该类型的构造函数参数。

完全独立于上述内容,如果 Database 向其客户公开类似 User 的东西是有意义的 以便更好地实现其预期功能 然后一定要给它一个 public 方法,该方法 return 是 UserInterface 的一个实例(同样,比具体类型好得多,尽管在这种情况下我们谈论的是 phpdoc 注释该语言无法根据 return 值的类型强制执行限制)。如果 Database 的工作不是为它的客户提供 User 那么 它一定不关心 它已经有一个 User 而那些客户可能想为自己的目的买一个。

请注意,这里没有 User 的两个 实例 ,只有两个 引用 到同一实例-- 没有开销。但是如果你出于某种原因想要这样做(单元测试是一个很常见的场景)那么你 可以 有两个实例,如果你有 BindClassUserDatabase