我最近注意到,在某些情况下我喜欢做的事情(调用 super)实际上是一种反模式。(http://en.wikipedia.org/wiki/Call_super)
所以我的问题是:
如何做以下的事情(我们大多数人需要的基本操作,即向对象添加一些细节)。我只是向保存在对象变量中的数组添加一个新元素:
<?php
class A {
// bla bla bla
public function __construct() {
$this->_data['newDetail'] = "Ipiicaei";
}
}
class B extends A {
// bla bla bla
// Override constructor, I need to add one more detail for this class
public function __construct() {
parent::__construct();
$this->_data['newDetailSubcls'] = "Something";
}
}
现在...如果我不调用父类构造函数来添加第一个元素,我有两种可能性:
- 在每个子类中添加父类通常执行的代码部分,并将其从父类中删除。所以如果我使用999个类进行扩展,我将在父类中重复999*行代码。这对我来说听起来很糟糕。
- 从在子类中实现的父类中调用一个方法(模板方法模式,他们推荐这样做)。因此,如果只需要为一个类添加该方法,而其他998个类的行为与父类完全相同,在每个类中都添加一个空函数。这对我来说也听起来很糟糕。
我可以看到在某些情况下调用super可能不好。但在这种情况下,我认为它还可以。
那么...你会怎么做?忽略调用super是一种反模式,并像我一样做(或者如果证明我的方法不好,那么以前的做法)吗?还是...怎么做?