【问题标题】:PHP: Method chaining with shared methodsPHP:使用共享方法的方法链
【发布时间】:2011-02-22 14:14:13
【问题描述】:

这是我考虑了一段时间的事情。我想将一组方法链接在一起,如下所示的示例。
方法链的概念很简单,但我想要的是让我们所有的动物都通过相同的add 方法添加,那么我应该如何确定我们在add 中添加的动物类型方法?

$zoo = new Zoo;
$lion = $zoo->lion->add('Lucas the lion');
$cockatoo = $zoo->cockatoo->add('Chris the cockatoo');

class Zoo {

    function add($name) {
        //How to figure out if the animal is a Lion or an Cockatoo?
    }

}

【问题讨论】:

  • 为什么不$zoo->add(new Lion('Lucas'));?在哪里class Lion implements IAnimal {}
  • 我无法忍受这样的束缚。我认为它完全破坏了可读性并使您的代码模棱两可。如果必须,我建议将其更改为:$zoo->add(new Lion('Lucas the Lion')); 它将 Lion 类与 Zoo 类分离,并让您更加灵活......
  • if($item instanceof Lion){ /* do something with lions */ }
  • @thephpdeveloper : $item 起源于哪里?
  • $item,假设你的参数$name改为$item

标签: php oop method-chaining


【解决方案1】:

由于我们谈论的是面向对象设计,因此实现层次结构会更加“正确”和灵活:

interface IAnimal {}
class Lion implements IAnimal {}

class Zoo
{
    private $animals = array();

    public function add(IAnimal $animal)
    {
        $this->animals[] = $animal;
        return $animal;
    }
 }

 $zoo = new Zoo();
 $lion = $zoo->add(new Lion('Lucas'));

【讨论】:

  • @Industrial: 是的,我希望是 ;-)
  • 我不明白它如何增加灵活性?覆盖对象中的代码不会添加任何内容(至少在此示例中)。如果你有更多关于你想隐藏的动物的数据,那么也许这是值得的。
  • @Yacoby:这是可以提示 OP 下一步做什么的最小样本。如果没有更多细节,我无法给出任何全面的代码。
  • 但确实如此。这意味着 Zoo::add 方法具有接口 IAnimal 的类型提示。您可以使用实现 IAnimal 并从那里继承的 Animal 父类甚至跳过接口来实现相同的目的。
  • @Abba Bryant:对不起,我无法理解你的意思。
【解决方案2】:

该问题的一种解决方案是在 Zoo 类中重写 __get 以返回“创建者”类。

function __get($animal){
    return new Creator($this, $animal);
}

然后让创建者类调用zoo类中的add函数。

class Creator{
    public function __construct($zoo, $animal){
    ....
    }
    public function add($details){
        $zoo->add($this->_animal, $details);
    }
}

这个解决方案相当丑陋,而且从未来开发人员的角度来看,还不是很清楚。正如 cmets 所指出的,有更好的方法来实现这一点。做类似的事情:

$zoo->add('lion', 'whatever')

$zoo->add( new Lion('Whatever') )

可能是一个更好的解决方案,在我看来,其他开发人员很清楚正在发生什么。 (对你来说可能不是这样,因为我不知道你在做什么的细节)。

【讨论】:

    猜你喜欢
    • 2019-06-10
    • 1970-01-01
    • 2012-12-05
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多