Лучшая практика: переопределение __construct () по сравнению с предоставлением метода init ()

Когда вы создаете подклассы объектов и хотите расширить код инициализации, есть два подхода. Переопределение __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 ().

27
задан Jake N 21 November 2011 в 12:00
поделиться

1 ответ

Я вижу одно преимущество от использования init() вместо __construct(): если сигнатура изменяется в конструкторе, вам придется обновить каждый производный класс, чтобы он соответствовал новой сигнатуре.

Если init() не имеет параметров, этого не произойдет.

0
ответ дан 28 November 2019 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: