1

我正在浏览一个对象列表,它们都具有相同的父类,但它们可能是许多子类之一的实例。根据对象的真实类型,我想执行略有不同的操作。

如何根据对象类型运行不同的代码块?

在 Java 中,我会用我想使用的每种类型重载一个处理函数,但 PHP 不允许这样做。

背景: 戈登的评论。

我们正在从一组对象构建表单。一个超类 Component,它被扩展以表示特定类型的表单元素。TextInput extends Component并且该组件具有容纳其他组件的能力。我们不希望他们对自己的实际代表负责。

我们现在正在努力构建 HTML,但我们可能希望使用它们来构建 .PDF 或其他格式。

所以我们有代码通过组件,并递归地通过它包含的组件。根据组件的类型,我们需要创建不同的输出。

4

3 回答 3

2
  1. 创建一个抽象类来代表对象的所有常见功能,并规定它们必须具有的其他方法,这样您就可以确保每次都使用相同的接口(这些称为抽象方法)。

  2. 然后为每种特定类型的对象创建子类。它们必须实现主抽象类中的所有抽象方法。

  3. 然后使用工厂模式根据确定对象类型(又名子类​​)的任何标志动态创建正确的对象。

于 2012-06-22T14:31:04.887 回答
2

像这样试试

function objectProcessor_A($o) {}
function objectProcessor_B($o) {}
function objectProcessor_C($o) {}

foreach($objects AS $o) {
    if(function_exist("objectProcessor_" . get_class($o)))
        call_user_func("objectProcessor_" . get_class($o), $o);
}

现在,我认为,最好的解决方案是使用继承。不能改变 $o 的行为/库代码?比使用工厂和添加方法作为匿名函数:

class OFactory {
    static function getO($type) {
        $r = new $type();
        if($type === "A") {
            $r.processor = function() {...};
        } else if($type === "B") {
            $r.processor = function() {...};
        } else if($type === "C") {
            $r.processor = function() {...};
        }
        return $r;
    }
}

$a = OFactory::getO("A");
call_user_func($a->processor);

$b = OFactory::getO("B");
call_user_func($b->processor);
于 2012-06-22T14:31:47.007 回答
2

利用

if($myobject instanceof class1){
}elseif($myobject instanceof class1){
}

或者

switch(get_class($myobject)){
    case 'class1':
       break;
    case 'class2':
       break;
}

另外,请确保您不要违反开放/封闭原则。如果你把那部分代码放在一个类中而不是控制器的特定部分,你最终会破坏代码的一个重要的可重用性特性:

开/关原则

你没做过插件系统吗?如果您这样做了,我确定您没有要求您的用户在代码中硬编码加载行来处理该插件,对吗?

通常来说,你希望你的类是可扩展的,而不需要改变父类。扩展应该是一个开放的原则,添加更多代码应该像扩展一样容易,但你永远不必修改父类。

因此,在父类或另一个类中添加一个开关来处理该类的所有可能版本打破了开放原则,因为用户必须更改类以添加更多功能......

于 2012-06-22T14:33:21.950 回答