【问题标题】:PHP Static vs InstancePHP 静态与实例
【发布时间】:2013-12-14 07:49:10
【问题描述】:

我正要写一个方法来将一些计费数据转换成发票。

假设我有一个对象数组,其中包含创建发票项所需的数据。

在计费控制器中,以下哪种方式是正确的

$invoice = new Invoice();
$invoice->createInvoiceFromBilling($billingItems);

然后在 Invoice 类中

Public Function createInvoiceFromBilling($billingItems)
{
    $this->data = $billingItems;

Invoice::createInvoiceFromBilling($billingItems)

然后在发票类中

Public Function createInvoiceFromBilling($billingItems)
{
    $invoice = new Invoice();
    $invoice->data = $billingItems;

哪种方式是正确的方式?

问候

【问题讨论】:

  • 您真正需要的是创建发票的工厂:$invoice = $invoceFactory->createFromBilling( $billingItems );
  • 默认第一个,通过构造函数传递$billingItem应该更好,呈现Billing和Invoice的依赖关系。但是,如果您有多种创建 Invoice 的方法(不仅来自计费),则应考虑第二种方法,例如设计模式中的 Factory。
  • 我对工厂一无所知,只是读了一遍,这似乎是个好主意,所以从某种意义上说,你会使用工厂来运行它,类似于第一个示例
  • @Fwolf,我的发票类有很多创建发票的方法,而且它也是我的 Yii 框架的模型类,所以构造函数会是个问题。因此,如果我使用该类从各种不同来源创建发票,则使用工厂方法,并仍然返回 Invoice 的实例
  • 到底是谁投票结束这篇文章是“基于意见的”?!?如果你能找到一个重复的,我会理解的(因为肯定有一个),但如果你坚持SOLID principles,则没有任何基于此的意见。

标签: php oop object static


【解决方案1】:

正如 tereško 在上面的 cmets 部分中指出的那样,您应该考虑使用 Factory pattern。来自链接源的一个很好(且简单)的基于真实世界的示例:

<?php
class Automobile
{
    private $vehicle_make;
    private $vehicle_model;

    public function __construct($make, $model)
    {
        $this->vehicle_make = $make;
        $this->vehicle_model = $model;
    }

    public function get_make_and_model()
    {
        return $this->vehicle_make . ' ' . $this->vehicle_model;
    }
}

class AutomobileFactory
{
    public function create($make, $model)
    {
        return new Automobile($make, $model);
    }
}

// have the factory create the Automobile object
$automobileFactory = new AutomobileFactory();
$veyron = $automobileFactory->create('Bugatti', 'Veyron');

print_r($veyron->get_make_and_model()); // outputs "Bugatti Veyron"

如您所见,实际创建汽车实例的是汽车工厂。

【讨论】:

  • -1:毫无意义地使用静态参数。每当您需要创建新实例时,这基本上会导致与类名的紧密耦合。
  • @tereško 在不知不觉中复制并粘贴了它。平心而论,该网站通常都不错。
  • 其实不是。它更像是一个供FIG会员使用的广告网站=/ .. 再说一次,这不像我们被宠坏了。无论如何:取消投票
  • @tereško 我最大的抱怨是它可以更好地组织/分类,但通常情况下,它确实推荐了一些好的做法。我想你关于不被宠坏的观点就在这里:)
【解决方案2】:

第一个编写的方法更好,因为在第二个中,您的代码将在每次调用时为发票生成对象。

【讨论】:

  • -1:请至少学习 OOP 的基础知识。问题不是关于“何时创建对象”,而是关于“如何从计费数据中创建发票”。
  • 有什么不喜欢的理由吗?
  • 请睁大你的眼睛,他创建的 Invoice() 对象不是单身人士;每次调用此函数时,提高您的阅读能力
  • 我猜你(以及任何支持你的不明智评论的人)不知道“工厂方法”(你是支持者)是一种反模式,会对架构造成严重影响。静态工厂方法既充当了一个复杂性的黑洞,因为它吸引了越来越多的外部逻辑,并创建了类名称的紧密耦合。
  • 看来你没有强大的opps你只是看到一个类并开始投票给它,即使是工厂模式也无法解决它,关键是他的解决方案不包含工厂或单例工厂,我指出。兄弟不要小看任何一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 2018-09-10
相关资源
最近更新 更多