gpt4 book ai didi

php - OOP(php)在另一个类中实例化类

转载 作者:可可西里 更新时间:2023-10-31 23:03:58 26 4
gpt4 key购买 nike

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

我必须支持和开发现有的项目。

它建立在 OOP 之上。

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

每个模型都绑定(bind)到一个相应的表。

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

我决定不要将旧的 Order 和新的 Order 混在一起。起初我将它们放在单独的表中,以免破坏工作系统并为它们创建不同的类。

现在我有模型 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 继承。

有了这样的方案我根本不会去碰整个系统的代码。在代码中的任何地方,assignemnts 都将具有以下外观

$product  = new Product

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

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

仍然不知道如何在 Product 类中替换它。我记得它在 C++ 中被称为类似动态绑定(bind)的东西。

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

抱歉文本太长,我尽量让它尽可能短。

最佳答案

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

But doing so in many places I got strong feeling that I do something very VERY wrong.

我同意。这就是覆盖的目的。
Assimung $global->objectCustomer 类型,添加一个方法 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 做同样的事情,而不是仅仅覆盖“默认”的方法

关于php - OOP(php)在另一个类中实例化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30773864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com