当你在子类化对象并想要扩展初始化代码时,有两种方法。一种是覆盖__construct()方法,另一种是实现一个初始化方法,让你的超类构造函数调用它。
方法1:
class foo
{
public function __construct ($arg1, $arg2, $arg3)
{
// Do initialization
}
}
class bar extends foo
{
public function __construct ($arg1, $arg2, $arg3)
{
parent::__construct ($arg1, $arg2, $arg3);
// Do subclass initialization
}
}
方法2
class foo
{
public function init ()
{
// Dummy function
}
public function __construct ($arg1, $arg2, $arg3)
{
// Do subclass defined initialization
$this -> init ();
// Do other initialization
}
}
class bar extends foo
{
public function init ()
{
// Do subclass initialization
}
}
Zend Framework的文档似乎不鼓励重写构造函数,而是建议在提供init方法时重写该方法,但这种方式并不让我感到舒适。另外,Zend还做了一些我不满意的事情,所以我不确定它是否应该被用作最佳实践的例子。个人认为第一种方法才是正确的,但我已经看到第二种方法被频繁使用,导致我开始怀疑是否应该采用第二种方法。你对覆盖__construct有什么评论吗?我知道你必须小心记得调用超类构造函数,但大多数程序员应该都知道这一点。
编辑:我没有使用Zend,我只是使用它作为一个鼓励使用init()而不是覆盖__construct()的代码库的例子。