【问题标题】:Different object definition based on constructor parameters in PHP?PHP中基于构造函数参数的不同对象定义?
【发布时间】:2011-10-20 17:16:16
【问题描述】:

我不相信这是可能的,并且在 Google 上搜索并没有产生任何结果,但我认为询问并没有什么坏处。

我正在尝试通过 PHP 库在我的网站上实现 Google Chart。我发现我非常喜欢的一个库 (googlechartphplib) 为每种类型的图表提供了大约 10 个不同的类文件。这意味着要创建饼图,我必须使用$chart = new GooglePieChart();,而要创建二维码,我必须使用$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;
    }
}

【问题讨论】:

    标签: php oop constructor


    【解决方案1】:

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

    这是Factories 存在的原因之一。

    【讨论】:

    • 看起来很棒。我会等一会儿看看是否有人有其他想法,但我可能正在这样做。不过,这确实带来了一个新问题。有没有一种好方法可以仅在工厂需要时包含特定类?如果我通常只使用一个,那么包含 10 个不同的类定义似乎是浪费内存。
    • 不错。完美运行。仍然会等待某人有更神奇的解决方案的机会,但除此之外这完美无缺。
    • @LeviMorrison:该链接已经过时了。我无耻地在The “Missing” Patterns of the PHP Manual 的评论中留下了备份,我打赌你更喜欢其他参考。
    • @hakre 我现在选择了一个新链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 2021-07-14
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多