Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中基于构造函数参数的不同对象定义?_Php_Oop_Constructor - Fatal编程技术网

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

PHP中基于构造函数参数的不同对象定义?,php,oop,constructor,Php,Oop,Constructor,我认为这是不可能的,在谷歌上搜索也没有任何结果,但我想问一下也没什么坏处 我正试图通过一个PHP库在我的站点上实现Google图表。我发现我非常喜欢的库()对于每种类型的图表都有大约10个不同的类文件。这意味着为了创建饼图,我必须使用$chart=new GooglePieChart()而要创建二维码,我必须使用$chart=new GoogleQRCode(),等等 然而,当我实际研究使用API时,我注意到图表类型被传递给构造函数(它被保存,然后作为查询字符串的一部分传递给API)。例如,制作

我认为这是不可能的,在谷歌上搜索也没有任何结果,但我想问一下也没什么坏处

我正试图通过一个PHP库在我的站点上实现Google图表。我发现我非常喜欢的库()对于每种类型的图表都有大约10个不同的类文件。这意味着为了创建饼图,我必须使用
$chart=new GooglePieChart()
而要创建二维码,我必须使用
$chart=new GoogleQRCode(),等等

然而,当我实际研究使用API时,我注意到图表类型被传递给构造函数(它被保存,然后作为查询字符串的一部分传递给API)。例如,制作折线图的代码不仅仅是
$chart=new GoogleChart(),它是
$chart=新谷歌图表('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个不同的类定义似乎是浪费了内存。工作完美。仍然要等待有人有一个更神奇的解决方案的机会,但除此之外,这是完美的。@LeviMorrison:这个链接已经存在了,是时候了。我厚颜无耻地在这里的评论中留下了一个备份,我打赌你更喜欢其他参考资料。@hakre我现在选择了一个新链接。看起来很棒。我会等一会儿,看看是否有人有其他想法,但我可能会这样做。不过,这确实带来了一个新问题。当工厂需要某个特定的类时,是否有一个好的方法来包含它?如果我通常只使用一个类定义,那么包含10个不同的类定义似乎是浪费了内存。工作完美。仍然要等待有人有一个更神奇的解决方案的机会,但除此之外,这是完美的。@LeviMorrison:这个链接已经存在了,是时候了。我厚颜无耻地在评论中留下了一个备份,我打赌你更喜欢其他参考资料。@hakre我现在选择了一个新链接。