OOP,依赖注入和构造函数

时间:2013-06-05 15:57:58

标签: php oop dependency-injection constructor

我正在尝试设计一些需要使用外部对象的类。外部对象来自第三方库。 psudocode中的示例

Class A {
    protected $foo

    public function __construct(\ThirdParty\Foo $foo) {
        $this->foo = $foo
    }
}

创建这些子类是为了保存具有稍微不同实现的方法,具体取决于Foo的实例化方式。

Class AA extends A {
    $fooInfo = 'red'
    public function __construct($foo) {
        parent::__construct($foo)
    }
    public function get() {
        return $this->foo->getTypeX();
    }
}

Class AB extends A {
    $fooInfo = 'white'
    public function __construct($foo) {
        parent::__construct($foo)
    }
    public function get() {
        return $this->foo->getTypeY();
    }
}

但是要使用第三方应用程序,我在实例化时需要$ fooInfo中的值。

$clientRed = new Foo('red')
$clientWhite = new Foo('white')

所以,当我实例化AA或AB时,我如何获取Foo对象的颜色信息?

$client = new AA(new Foo(????))

2 个答案:

答案 0 :(得分:1)

class AA extends A {
  const fooInfo = 'red'
  ...

$client = new AA(new Foo(AA::fooInfo))

您也可以创建工厂:

function CreateClient ($clientType) {
    return new $clientType(new Foo($clientType::fooInfo))
}

$client = CreateClient('AA')

答案 1 :(得分:0)

使用工厂为您实例化对象。

像这样:

class ClientFactory {
    public function getClient($objectType){
        switch(objectType) {
           case 'AA':
              $fooInfo = 'red';
              break;
           case 'AB':
              $fooInfo = 'white';
              break;
        }
        $foo = new Foo($fooInfo);
        return new $objectType($foo);
    }
}

您的客户现在无需了解所创建的Foo课程。它只知道它有一个。如果类别的要求发生变化(AB现在也需要'红色'Foo),您可以在一个位置进行更改。