我正在构建一个 MVC PHP 框架,我想知道哪些是在我的类中加载我需要的内容的最佳实践,无论是其他类还是普通配置。
直到今天,我一直在使用单例、注册表和最近的依赖注入容器。虽然许多人声称 DI 是要走的路,但在我看来,它只是将组件之间的耦合问题转移到了另一个地方。
Singletons 引入了全局状态,registry 引入了紧密耦合,DI 引入了......嗯,很多复杂性。我仍然很困惑,找不到正确的方法将我的课程相互连接。
与此同时,我想出了一个定制的解决方案。实际上这不是一个解决方案,它只是从我的代码中抽象出服务加载的实现。
我用 _load_service 和 _load_config 方法构建了一个抽象类,我的框架的所有组件都扩展了这些方法,以便加载其他服务或配置。
abstract class Base_Component {
function _load_service($service) {
// could be either
return DI_container::getInstance()->$service;
// or
$class = '\services\\'.$service;
return new $class;
// or other implementation
}
}
加载它们的实现现在只在一个地方实现,即基类,所以至少我在组件中去掉了如下代码行:
$database = new Database(Registry::getInstance()->load('db_config'));
或者
$database = DI_container::getInstance()->database;
现在,如果想要一个数据库实例,我会这样做
$database = $this->_load_service('database');
以及服务加载器、容器、注册表或任何可以在单个类方法中轻松更改的实现,而无需搜索我的所有代码来更改对我之前使用的任何容器实现的调用。
但正如我所说,我什至不确定我将使用什么方法来加载类和配置。
你有什么意见?