2011-10-20 32 views
0

我不認爲這是可能的,而在Google上搜索並沒有產生任何結果,但我認爲從不會受到任何困擾。基於PHP中構造函數參數的不同對象定義?

我想通過PHP庫在我的網站上實現Google Chart。我發現我非常喜歡的一個圖書館(googlechartphplib)每種類型的圖表都有大約10個不同的類文件。這意味着,爲了創建一個餅圖,我必須使用$chart = new GooglePieChart();而創建一個QR碼我必須使用$chart = new GoogleQRCode();

但是當我真正看着使用API​​,我注意到,圖表類型傳遞到構造函數(它被保存,然後作爲查詢字符串的一部分傳遞給API)。例如,代碼,使線圖不只是$chart = new GoogleChart();,這是$chart = new GoogleChart('lc', 500, 200);(其中lc定義了「折線圖」,500和200是尺寸)

這讓我思考:我爲什麼不能只是讀這第一個參數確定創建哪種類型的圖表?有一個通用的構造函數:

$piechart = new GoogleChart('pie'); 
$linechart = new GoogleChart('lc'); 
$qrcode = new GoogleChart('qr'); 
... 

我可以想到一種在我的所有函數調用中都使用switch/case語句的方法。例如:

public function computeQuery() { 
    switch($this->type) { 
     case 'qr': 
      /* QR code function */ 
      break; 
     case 'pie': 
      /* Pie chart function */ 
      break; 
     case 'lc': 
     default: 
      /* line chart code */ 
      break; 
    } 

然而,這會涉及重新編寫所有的代碼已經存在的(我的複製/能力略有加快粘貼90%的代碼)。有沒有辦法簡單地選擇哪個類的結果對象應該基於構造函數參數?例如:

public function __construct($type, $x, $y) { 
    $this->type = $type; 
    switch($type) { 
     case 'qr': 
      return new GoogleQRCode($x, $y); 
     case 'pie': 
      return new GooglePieChart($x, $y); 
     case 'lc': 
     default: 
      $this->width = $x; 
      $this->height = $y; 
    } 
} 

回答

5

不是在構造函數中,你不能。

這就是Factories存在的原因之一。

+0

看起來很棒。我會等一會兒,看看有沒有人有其他想法,但我可能會這樣做。不過這確實會帶來一個新問題。當工廠需要它時,是否有一種很好的方法來只包含一個特定的類?如果我通常只使用一個,那麼看起來浪費的內存包含10個不同的類定義。 – stevendesu

+1

查看自動加載:http://php.net/manual/en/language.oop5.autoload.php –

+0

不錯。完美的作品。仍然會等待別人有更神奇的解決方案,但否則這種方法完美無缺。 – stevendesu

相關問題