加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 克隆依赖项副本(依赖注入)是否有意义?

发布时间:2020-12-13 17:24:57 所属栏目:PHP教程 来源:网络整理
导读:假设我有一个类,它有一些依赖于另一个对象的方法来执行它们的任务.不同之处在于它们都依赖于同一类对象,但需要不同的类实例.或者更具体地说,每个方法都需要一个干净的类实例,因为这些方法将修改依赖项的状态. 这是我想到的一个简单例子. class Dependency {
假设我有一个类,它有一些依赖于另一个对象的方法来执行它们的任务.不同之处在于它们都依赖于同一类对象,但需要不同的类实例.或者更具体地说,每个方法都需要一个干净的类实例,因为这些方法将修改依赖项的状态.

这是我想到的一个简单例子.

class Dependency {
    public $Property;
}


class Something {
    public function doSomething() {
        // Do stuff
        $dep = new Dependency();
        $dep->Property = 'blah';
    }

    public function doSomethingElse() {
       // Do different stuff
       $dep = new Dependency(); 
       $dep->Property = 'blah blah';
    }
}

从技术上讲,我可以这样做.

class Something {
    public function doSomething(Dependency $dep = null) {
        $dep = $dep && is_null($dep->Property) ? $dep : new Dependency();
        $dep->Property = 'blah';
    }

    public function doSomethingElse(Dependency $dep = null) {
       $dep = $dep && is_null($dep->Property) ? $dep : new Dependency();
       $dep->Property = 'blah blah';
    }
}

我遇到的麻烦是我经常要检查传入的依赖对象是否处于正确的状态.新创建的州.所以相反,我正在考虑做这样的事情.

class Something {
    protected $DepObj;

    public function __construct(Dependency $dep) {
        $this->DepObj = $dep && is_null($dep->Property) ? $dep : new Dependency();
    }
    public function doSomething() {
        // Do stuff
        $dep = clone $this->DepObj;
        $dep->Property = 'blah';
    }

    public function doSomethingElse() {
       // Do different stuff
       $dep = clone $this->DepObj;
       $dep->Property = 'blah blah';
    }
}

这允许我以正确的状态获取对象的一个??实例,如果我需要另一个,我可以复制它.我只是好奇这是否有意义,或者我是否正在寻找关于依赖注入和保持代码可测试的基本准则.

解决方法

我会使用Factory模式:

class Dependency {
    public $Property;
}

class DependencyFactory
{
    public function create() { return new Dependency; }
}

class Something {
    protected $dependencies;

    public function __construct(DependencyFactory $factory) {
        $this->dependencies = $factory;
    }

    public function doSomething() {
       // Do different stuff
       $dep = $this->dependencies->create();
       $dep->Property = 'Blah';
    }

    public function doSomethingElse() {
       // Do different stuff
       $dep = $this->dependencies->create();
       $dep->Property = 'blah blah';
    }
}

您可以通过引入接口来进一步解耦工厂:

interface DependencyFactoryInterface
{
    public function create();
}

class DependencyFactory implements DependencyFactoryInterface
{
    // ...
}

class Something {
    public function __construct(DependencyFactoryInterface $factory) 
    ...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读