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


Different object definition based on constructor parameters in PHP?

我不相信这是可能的,在谷歌上搜索也没有任何结果,但我认为问一问总有坏处。

我试图通过PHP库在我的网站上实现谷歌图表。我发现我非常喜欢的一个库(googlecharphplib)为每种类型的图表提供了大约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;
    }
}

不在构造函数中,