在我的MVC项目(PHP 7.1(中,我有一个Config
类和众多配置文件,每个config Files看起来都这样:
return [
'web' => [
'host' => 'localhost',
//...
],
];
在应用程序输入点我制作了Config
类的实例,并加载所有配置文件数组。然后,创建的对象将作为需要它的所有类中的构造函数参数传递:
class AbstractView {
private $config;
public function __construct(Config $config) {
$this->config = $config;
}
private function prepareContext() {
$this->assign('appHost', $this->getConfig()->get('web/host'));
}
}
因为在我的应用程序中完全通过Config
对象是一项非常"巨大的努力",所以我想实现只有类常数的Config
类,例如:
class Config {
const WEB_PROTOCOL = 'http';
const WEB_HOST = 'localhost';
}
并通过
直接从总体上访问它们class AbstractView {
private function prepareContext() {
$this->assign('appHost', Config::WEB_HOST);
}
}
我的问题是:
- 这是一个非常不错的选择,请记住我想完全避免在我的应用程序中静态状态?
- 这个替代方案是"静态"一个或绝对不是吗?
- 可检验性呢(我还没有任何经验(?
非常感谢。
如果您打算测试此代码,这将非常复杂,因为您必须为每个变体提供一个自定义自动加载器,您想测试(嗯..您也可以使用单个自动加载器,它具有一些静态方法来悬挂其行为(。这将使整个单位测试一场噩梦。
在您的位置中,我会朝着不同的方向:尝试隔离配置。似乎您正在传递所有配置,即使实例仅使用一个或两个值。
这种方法会导致隐藏的依赖性,从而产生高度耦合的代码,而您实际上不知道,您的实例是必需的。
建议
开始在代码中使用DI容器。
它将让您卸载大量配置,因为您从配置中提取的某些"参数"可以作为构造函数中的直接依赖项传递。
并使用神奇的Config
实例,其中DIC不是一个干净的选项。但是,您可能应该使用多个Config
实例,每个实例代表设置的一部分,它们一起使用。