2013-06-05 156 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),你可以在一個地方改變它。