基于PHP中的构造函数参数的不同对象定义?

时间:2011-10-20 17:16:17

标签: php oop constructor

我不相信这是可能的,而且在Google上搜索并没有产生任何结果,但我认为这样做绝对不会伤害。

我试图通过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;
    }
}

1 个答案:

答案 0 :(得分:5)

不在构造函数中,你不能。

这是Factories存在的一个原因。