2017-07-03 118 views
0

我有兩個產品類,Line和Trunk,都需要getServiceFee和setServiceFee函數來返回/操作他們的serviceFee成員變量。如何在僅在運行時知道類型的情況下創建對象?

  1. 我怎麼創造一個對象的類型只在運行時已知的情況的線路或幹線
  2. 我怎樣寫這是傳遞要更新的對象假設我不知道做一個功能傳遞給它的對象是一條線或一條中繼線。

回答

3

這是接口派上用場的地方。

創建一個具有setter和getter的serviceFee屬性接口:

interface SomeInterface 
{ 
    public function getServiceFee(); 

    public function setServiceFee($fee); 
} 

確保這兩個類實現該接口,並添加setter和getter:

class Line implements SomeInterface 
{ 
    protected $serviceFee; 

    public function getServiceFee() 
    { 
     return $this->serviceFee; 
    } 

    public function setServiceFee($fee) 
    { 
     $this->serviceFee = $serviceFee; 
    } 
} 

class Trunk implements SomeInterface 
{ 
    protected $serviceFee; 

    public function getServiceFee() 
    { 
     return $this->serviceFee; 
    } 

    public function setServiceFee($fee) 
    { 
     $this->serviceFee = $serviceFee; 
    } 
} 

在方法操縱serviceFee,鍵入提示界面並使用getter和setter。現在沒關係,對象是Line或Trunk類型。只要它實現了接口,可以肯定的是,getter和setter存在:

class SomeClass 
{ 
    public function someMethod(SomeInterface $instance) 
    { 
     $fee = $instance->getServiceFee(); 

     // do stuff 

     $instance->setServiceFee($fee); 

     return $instance; 
    } 
} 

要動態創建的情況下,你可以這樣做(你需要知道一些點創建什麼類型,雖然):

$type= 'Trunk'; 

$instance = new $type; 
$instances->setServiceFee(1234); 

$someClass = new SomeClass; 
$instance = $someClass->someMethod($instance); 
+0

我還要補充一點,如果'Trunk'和'Line'情況下有不同的依賴自己,那麼'$實例=新的$ type'也許應該通過向DIC調用替換(或者,如果架構不足,可能是服務定位器)。 –

+0

@tereško確實。我只是不想進入容器等,因爲我們不知道OP的設置實際上是什麼樣子。不過,我同意使用依賴注入容器是要走的路。但是直接調用DIC來獲取實例不是DI,只是將它用作服務定位器,不是? –

相關問題