我目前正在为我的网站构建一个新的“框架”“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
取决于User
和Database
的方式。由于User
已经包含Database
,因此技术上不会是{em>两个 Database
的实例。做什么?
这不是达到我想要的结论的正确方法(BindClass
能够访问User
& Database
的'属性',如果是,那么“是什么”正确的方法”?我主要担心的是,我“包含”已经与Database
“连接”的东西。
答案 0 :(得分:1)
TL; DR:您的示例设计完全没问题,事实上它是一个教科书示例,说明在没有关于这些类是什么以及它们究竟是什么的具体信息的情况下应该如何完成事情。应该做的。
我主要担心的是,我包括"包括"已经存在的东西 "连接"到数据库。
您的主要关注点应该是确保准确地涉及每个类,并将其依赖关系及其预期的公共接口传达给外部世界。
如果Database
等类真的需要某些User
的服务才能为其客户提供服务,那么Database
应该采用UserInterface
的实例(它的很多更好地使用接口而不是具体类型)作为依赖,例如通过要求该类型的构造函数参数。
完全独立于上述内容,如果Database
将User
之类的内容暴露给其客户以便更好地实现其预期功能,则完全独立于此表示给它一个返回UserInterface
实例的公共方法(再次,比具体类型好得多,尽管在这种情况下我们讨论的是phpdoc注释,因为语言不能根据返回值的类型强制实施限制) 。如果Database
的作业不是为其客户提供User
,那么它一定不在乎它已经有User
并且那些客户可能想要为了自己的目的得到一个。
请注意,此处没有User
的两个实例,只有两个引用到同一个实例 - 没有开销。但是如果你想出于某种原因(单元测试是一种非常常见的情况)那么你可以有两个实例,如果你BindClass
拉{{1}那么这是不可能做到的User
之外的。{/ p>