【问题标题】:Add dynamically methods to an object向对象动态添加方法
【发布时间】:2015-08-25 09:12:02
【问题描述】:

您能帮我找到解决问题的方法吗?

我有一个代表实体的类(我将其称为“实体”) 我想根据不同的标准为我的实体动态添加方法。

例如:

如果$_POST['TYPE'] == 'typeA',我想添加以下方法:

  • 方法1()
  • 方法2()
  • 方法3()
  • 方法4()

如果$_POST['MODE'] == 'modeA',我想添加以下方法:

  • 方法5()
  • 方法6()
  • 方法7()

问题是会有很多可能的方法,如果我将它们全部添加到我的班级,我担心我的班级会变得太大。我还想避免每次出现新情况时都编辑我的课程。

我最初考虑按案例分类,但我有太多案例(大约 5 个标准,每个标准有 6 或 7 个可能的不同值),所以总共大约有 50 或 60 个不同的案例。

那么最好的解决方案是什么?

我应该在我的类中添加所有可能的方法吗?

我应该使用继承并创建所有可能类型的对象(Type1Mode1Entity、Type1Mode2Entity、...)吗?

你知道一种设计模式(装饰器吗?)来做到这一点?

【问题讨论】:

    标签: php oop design-patterns


    【解决方案1】:

    为您的案例创建单独的类,使用通用方法扩展抽象类,然后使用工厂 DP 加载所需的类

    【讨论】:

    • 谢谢 Auris,我也犹豫是否要逐个创建一个新类,但我有很多不同的案例(大约 8 个不同的 $_POST['type'],5 个不同的 $_POST['mode' ],以及 3 或 4 个其他标准,我必须有大约 50 或 60 个案例)所以如果有必要,我会尽量消除无用的案例(如果可以的话)但是,我希望你能理解我,我更喜欢另一种解决方案
    • 您可能需要对您的结构进行相当多的抽象并将其拆分为一组案例,因此您正在考虑构建一个小型库而不是一个类来处理所有这些。但这就是 OOP 的全部意义所在。一旦您创建了实体结构(对于像您这样的情况,它可能看起来更像是一棵树而不是一组扁平的类。)您所要做的就是编写一个返回正确对象的工厂类。向对象添加方法是不可能的,您只能将对象加载到对象中,但这是一种非常混乱的方法,而使用工厂是一种更简洁的方法。
    • 谢谢你的回答,你的解释给了我一个想法。我将创建一个具有通用方法的通用实体,可能还有不同的类,类型为 Mode1Module、Mode2Module、Type1Module... 链接到我的实体并包含我的方法
    • 您好,这可以工作。但是模块链接可能有点麻烦(完全取决于您如何编写加载程序。无论如何,很高兴我能以某种方式提供帮助。
    猜你喜欢
    • 2011-02-25
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 2016-02-08
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多