我正在编写一个考虑到可测试性的php应用程序,因此我的类总是在它们的构造函数中请求依赖于依赖注入模式的“协作者对象”。
这样,我就可以在单元测试中传递模拟或测试实现。
不过,我想实现的是能够用传递给其构造函数参数的空值实例化一个类,以便触发一个回退机制,该机制为每个协作者实例化一个默认实现类。
因为在php中不能给对象类型参数指定默认值,所以我必须在构造函数中执行此操作。下面的代码是我当前使用的方法的一个示例:

class Engine
{
    private $loader;
    private $logger;

    public function __construct(ResourceLoader $loader = null, Logger $logger = null)
    {
        if ($loader == null) $loader = new DefaultResourceLoader;
        if ($logger == null) $logger = new DefaultLogger;

        $this->loader = $loader;
        $this->logger = $logger;
    }
}

你觉得这个怎么样?我应该改用ioc容器,还是有其他方法给对象类型参数一个默认值?

最佳答案

当然,你最好用一个ioc/dip容器来完成这项工作。上面的代码(if语句)增加了类的耦合。客户端类(引擎)不应该关心是什么在实现加载程序和记录器角色。这是工厂或浸渍容器的工作知道这一点。通过将具体的类名放入代码中,并将类绑定在一起,使代码变得不灵活(灵活),不可重用,因而可维护性较差。

09-30 14:58
查看更多