OOP(php)在另一个类

时间:2015-06-11 07:05:02

标签: php class oop design-patterns

不确定我是否选择了正确的标题。但无论如何。

我必须支持并开发已有的项目。

它建立在OOP之上。

我有订单,产品等型号。它们经常用于代码中。

每个模型都绑定到相应的表。

客户希望将新类型的客户集成到系统中。 这类客户拥有与之相关的不同数据,并订购完全不同类型的产品。所以订单看起来会有所不同。

我决定不将旧的秩序和新的秩序混合在一起。首先,我将它们放入分离的表中,以便不破坏工作系统并为它们创建不同的类。

现在我有型号Order.php和OrderNew.php,Product.php和ProductNew.php等等。

我是全局设置对象,其中属性包含我需要实例化的类型。

现在我已经搞砸了很多代码:

if ($global->object->isNewKindOfCustomer())  {
   $product = new ProductNew;   
} else {
   $product  = new Product;
}

但是在很多地方这样做我强烈感觉我做了一件非常错误的事。

所以我的第一个想法是应该由类Product决定应该实例化什么样的产品。

如果我可以转到旧的Product类并在其构造函数中执行并执行某些操作,那将是完美的:

Class Product {
  __construct() {
    if ($global->object->isNewKindOfCustomer())  {
      $product = new ProductNew;   
    } else {
       $product  = new Product();
    }
  }
 }

此外,我将从Product继承ProductNew并重新定义需要更改的所有方法。类似的东西:

Class ProductNew extends Product {

  public methodsDefinedInProductButInNeedToBeChangedForProductNew (){
  }
}

但问题是我没有设法在PHP中找到一种理智的方式,它仍然闻起来不太好。但比第一种方法好得多(至少对我而言)。

第三个想法是,我现在将创建ProductNew类,但也创建ProductOld类(不存在但我本身得到的东西)。

我会将当前Product类的所有代码移动到ProductOld。 所以我目前的Product类没有方法。它会变空。 此外,ProductNew将继承自ProductOld。

有了这样的计划,我根本不会触及整个系统的代码。 在代码中的任何地方,配置都将具有以下外观

$product  = new Product

并且在内部我将需要以某种方式管理将在Product构造函数中创建的对象。

第四个想法是,我将首先创建一个泛型类,并将其命名为例如产品一般。它将包含与ProductNew和ProductOld类相关的方法。他们都将扩展ProductGeneral。而在Product内部,只会根据当前用户的角色实例化适当的类。虽然我不确定ProductGeneral是否如此必要......

仍然不知道如何在Product类中替换它。我记得它在C ++中被称为动态绑定。

有没有更好的解决方案来解决这个问题?我错过了什么吗?

很抱歉,我试图让它尽可能短。

3 个答案:

答案 0 :(得分:2)

if ($global->object->isNewKindOfCustomer())  {
   $product = new ProductNew;   
} else {
   $product  = new Product;
}
     

但是在很多地方这样做我强烈感觉我做了一件非常错误的事。

我同意。这就是压倒一切的原因 Assimung $global->object的类型为Customer,添加您可以根据需要覆盖的方法newProduct

class Customer
{
    public function newProduct()
    {
        return new Product();
    }
}

class CustomerNew extends Customer
{
    public function newProduct()
    {
        return new ProductNew();
    }
}

然后,您必须准确检查一次是处理新客户类型还是旧客户类型(在实例化CustomerCustomerNew时),而不是再次。 这基本上就是“工厂模式”,而不是一个单独的类。

此外,我建议您不要使用“普通”旧类和新的重写类,而是将所有共同点移动到新的基类,例如

abstract class CustomerBase
{
    // Define here all methods that Customer and CustomerNew have in common

    // And make "implementation-dependent" methods abstract:
    public abstract function newProduct();
}

class Customer extends CustomerBase
{
    public function newProduct()
    {
        return new Product();
    }
}

class CustomerNew extends CustomerBase
{
    public function newProduct()
    {
        return new ProductNew();
    }
}

这将是一个“更清晰”的实现(语义上),您仍然不必用Customer或其他东西替换代码中的每个CustomerOld
我建议您使用Product执行相同的操作,而不是仅仅覆盖“默认”中的方法

答案 1 :(得分:1)

您可能希望Product类包含所有基本函数,ProductOld具有特定于该类的函数,以及ProductNew具有特定于该类的函数。此外,ProductFactory将返回您需要的产品类。

如果没有看到代码,就很难说上面是否最好,或只是extend Product类,并且ProductFactory

答案 2 :(得分:1)

哦不:(完全错了。

Class Product {
  __construct() {
    if ($global->object->isNewKindOfCustomer())  {
      $product = new ProductNew;   
    } else {
       $product  = new Product();
    }
  }
 }

你从哪里得到$global?它不在你的构造函数中。你无法从任何地方获得实例。这会产生untestable code

您正在寻找factory pattern