2013-06-05 53 views
0

我试图设计一些需要使用外部对象的类。外部对象来自第三方库。 实施例中psudocodeOOP,依赖注入和构造函数

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' 
    pubic function __construct($foo) { 
    parent::__construct($foo) 
    } 
    public function get() { 
    return $this->foo->getTypeY(); 
    } 
} 

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

$ clientRed =新的Foo( '红') $ clientWhite =新的Foo( '白')

所以,当我实例AA或AB我怎样使色彩信息Foo对象?

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

出于某种原因广东话编辑标签,可能要提到这是PHP虽然 –

回答

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') 
+0

[*常量不面前有一个美元符号($) *](http://php.net/const)例如:'const FOO_INFO ='red';''你可能意思是'static'例如:'static $ fooInfo ='red';' – Touki

+0

@Touki:我不是精通PHP。我认为常数在这里更合适。将删除美元符号。 –

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),你可以在一个地方改变它。