Php 如何从类型定义的特定类或属性中进行选择?

Php 如何从类型定义的特定类或属性中进行选择?,php,oop,design-patterns,Php,Oop,Design Patterns,我需要创建一个具有多态对象的系统 每种类型的对象都应该由特定的处理程序处理,因此我需要确定正确处理它的类型 我想知道什么是最好的设计决策: 创建一个抽象基类,比如ObjectBase,然后扩展到特定的 对象,如CustomObjectA和CustomObjectB 创建一个泛型对象GenericObject,并使用传递给构造函数的$type属性(类型应该是不可变的) 请注意,对象没有区别,只是处理它们的方式不同,我的意思是,在它们的行为中没有添加属性、方法或任何东西 有什么反馈吗 编辑:

我需要创建一个具有多态对象的系统

每种类型的对象都应该由特定的处理程序处理,因此我需要确定正确处理它的类型

我想知道什么是最好的设计决策:

  • 创建一个抽象基类,比如
    ObjectBase
    ,然后扩展到特定的 对象,如
    CustomObjectA
    CustomObjectB

  • 创建一个泛型对象
    GenericObject
    ,并使用传递给构造函数的
    $type
    属性(类型应该是不可变的)

请注意,对象没有区别,只是处理它们的方式不同,我的意思是,在它们的行为中没有添加属性、方法或任何东西

有什么反馈吗


编辑:

第一种解决方案

abstract class ObjectBase {}


class CustomObjectA extends ObjectBase {}

class HandlerManager {
     public function process(ObjectBase $object) {
          if ($object instanceof CustomObjectA) {

              $customObjectAHandler->process($object);
          }
     }
}
第二种解决方案

class GenericObject {
    protected $type;

    public function __construct($type)
    {
        $this->type = $type;
    }
}

class ObjectTypeAHandler {
    public function process(GenericObject) { 
    }

    public function supportsType(GenericObject $object)
    {
        return 'typeA' === $object->getType();
    }
}

   class HandlerManager {
       public function process(GenericObject $object) {
          if ($customObjectAHandler->supportType($object)) {
               $customObjectAHandler->process($object);
          }
       }
    }

让所有处理程序共享一个基类。让对象使用基类上抽象的工厂方法创建正确的处理程序。

我建议您使用第一种方法。创建两个没有body的对象并不难,但是如果你想在将来改变它们的行为,你将有很多事情要做。

我不认为处理程序应该设置在对象级别,它应该知道它的处理程序,这违反了OOP的许多规则(参见SOLID)ImhoI认为我不清楚:我的建议是抽象工厂模式的变体,只有对象也扮演abstrat工厂的角色。没有理由改变行为,顺便说一句,第二种解决方案并不禁止您扩展对象以进行自定义,因为基类总是匹配的