为 类 允许 "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
如何依赖于 User
和 Database
。由于 User
已经包含 Database
,所以从技术上讲,这不是 两个 个 Database
实例吗?
这不是达到我想要的结论的正确方法吗(BindClass
能够访问 User
和 Database
的 '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
应该采用一个实例UserInterface
(much 更好地使用接口而不是具体类型)作为依赖项,例如需要该类型的构造函数参数。
完全独立于上述内容,如果 Database
向其客户公开类似 User
的东西是有意义的 以便更好地实现其预期功能 然后一定要给它一个 public 方法,该方法 return 是 UserInterface
的一个实例(同样,比具体类型好得多,尽管在这种情况下我们谈论的是 phpdoc 注释该语言无法根据 return 值的类型强制执行限制)。如果 Database
的工作不是为它的客户提供 User
那么 它一定不关心 它已经有一个 User
而那些客户可能想为自己的目的买一个。
请注意,这里没有 User
的两个 实例 ,只有两个 引用 到同一实例-- 没有开销。但是如果你出于某种原因想要这样做(单元测试是一个很常见的场景)那么你 可以 有两个实例,如果你有 BindClass
拉User
共 Database
。
我目前正在为我的站点构建一个新的 "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
如何依赖于 User
和 Database
。由于 User
已经包含 Database
,所以从技术上讲,这不是 两个 个 Database
实例吗?
这不是达到我想要的结论的正确方法吗(BindClass
能够访问 User
和 Database
的 '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
应该采用一个实例UserInterface
(much 更好地使用接口而不是具体类型)作为依赖项,例如需要该类型的构造函数参数。
完全独立于上述内容,如果 Database
向其客户公开类似 User
的东西是有意义的 以便更好地实现其预期功能 然后一定要给它一个 public 方法,该方法 return 是 UserInterface
的一个实例(同样,比具体类型好得多,尽管在这种情况下我们谈论的是 phpdoc 注释该语言无法根据 return 值的类型强制执行限制)。如果 Database
的工作不是为它的客户提供 User
那么 它一定不关心 它已经有一个 User
而那些客户可能想为自己的目的买一个。
请注意,这里没有 User
的两个 实例 ,只有两个 引用 到同一实例-- 没有开销。但是如果你出于某种原因想要这样做(单元测试是一个很常见的场景)那么你 可以 有两个实例,如果你有 BindClass
拉User
共 Database
。