Когда вы создаете подклассы объектов и хотите расширить код инициализации, есть два подхода. Переопределение __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 не одобряет переопределение конструкторов и требует от вас переопределения методов инициализации, если они предусмотрены, но мне это почему-то кажется неправильным. Zend также имеет тенденцию делать несколько вещей, которые мне не нравятся, поэтому я не уверен, следует ли использовать его в качестве примера передовой практики. Я лично считаю, что первый подход является правильным, но я видел второй подход достаточно часто, чтобы задаться вопросом, действительно ли это то, что мне следует делать.
Есть ли у вас какие-либо комментарии по поводу переопределения __construct? Я знаю, что вы должны быть осторожны, чтобы не забывать вызывать конструктор суперкласса, но большинство программистов должны знать об этом.
РЕДАКТИРОВАТЬ: Я не использую Zend, я использую его только как пример кодовой базы, которая побуждает вас использовать init () вместо переопределения __construct ().
Я вижу одно преимущество от использования init()
вместо __construct()
: если сигнатура изменяется в конструкторе, вам придется обновить каждый производный класс, чтобы он соответствовал новой сигнатуре.
Если init()
не имеет параметров, этого не произойдет.