我不認爲這是可能的,而在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;
}
}
看起來很棒。我會等一會兒,看看有沒有人有其他想法,但我可能會這樣做。不過這確實會帶來一個新問題。當工廠需要它時,是否有一種很好的方法來只包含一個特定的類?如果我通常只使用一個,那麼看起來浪費的內存包含10個不同的類定義。 – stevendesu
查看自動加載:http://php.net/manual/en/language.oop5.autoload.php –
不錯。完美的作品。仍然會等待別人有更神奇的解決方案,但否則這種方法完美無缺。 – stevendesu