我对使用 init 的做法有疑问。如果我有一个包含多个子类的父类,并且它们的 init 函数中都有相同的内容,那么最好将该内容放在父 init 类中,然后简单地执行以下操作:
public function init(){
parent::init();
}
这似乎是合乎逻辑的,但我读到的每一个地方,不幸的是 zend 特定的,他们说将父类中的 init 方法留空以避免复杂性。
有人可以澄清一下吗?
我认为您将看到的只是编码实践的差异。
如果所有子类都具有相同的确切init()
方法,则甚至没有理由在子类中声明该方法。
但是,在某些情况下,我看到开发人员完全按照您的说明进行操作。在很多情况下,这可能是因为最终的意图可能是以某种特定于类的方式增强父方法的行为。在其他情况下,我看到一些子类的集合覆盖了功能,因此开发人员在所有子类中放置了这样的方法,以便其他开发人员清楚其意图(执行该子类的父方法)。
init()
许多 Zend 类都有构造函数,它们在构造函数的末尾调用这些函数。这个想法(我假设)是从它们继承的类可以避免调用
public function __construct(){
parent::__construct();
//child class logic
}
IMO 这是一种不必要的便利。
无论如何,您想要调用parent::init()
子类的唯一原因是它真的是 Zend 孙子类,并且它的父类在它的init()
. 在这些情况下,一个空函数应该调用它的父函数,或者被完全删除。
等等,什么?如果父类需要一个init
方法,而子类需要完全相同的方法……只需将其添加到父类,对子类不做任何事情,因为它们会自动继承它。
这个:
public function init(){
parent::init();
}
写成这样更好:
(是的,这没什么。如果该方法所做的只是调用父方法,则将其省略。)
如果您的子类扩展了父类并且不覆盖父类的方法,则子类只是继承父类方法。Zend 与此无关。
例子
class A {
function foo() {
echo "foo";
}
}
class B extends A {}
$b = new B();
$b->foo();
输出是
foo
况且init
也不是什么法宝。它与原来的方法相同foo
。Zend 中使用它的事实来自于它的设计。它可以被命名为initialize
or foo
(当然,在 ZF 中,它是比此方法init
更好的选择)。foo