вопрос по свойствам родителя/наследника

Духовность™

Продвинутый новичок
Какие те же? Этот "второй конструктор" позволяет не затрагивать интерфейс реального конструктора и в любой момент изменять набор его входных параметров.
 

Adelf

Administrator
Команда форума
кому нужно менять набор входных параметров у пустого конструктора?
 

Breeze

goshogun
Команда форума
Партнер клуба
Получается, что конструктор базового класса мы не трогаем, соответственно не боимся, что если завтра изменятся параметры конструктора, не придется переписывать кучу классов-потомков.
хук он и в Африке хук, по крайней мере нет необходимости каждый раз звать parent::__construct.
я такое пользую для модулей, система достаточно старая, но данный подход оказался удобен и пока нет причин что-то менять.
наследуемый конструктор формирует минимально необходимый для работы набор объектов(свойства идут в декларации), а в хуке идет логика инициализации самого модуля, если ему мало того, что наколбасил парент-конструктор.

но конструктор придется переопределить и ручками звать хук, если куча из парент-конструктора будет не нужна.

в общем кмк подход зависит от того, что нужно чаще.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Трим, так как раз нормально. Я как раз в методе init конфигурации внешние подгружаю.
 

Духовность™

Продвинутый новичок
кому нужно менять набор входных параметров у пустого конструктора?
кто сказал, что он пустой? У меня вот реальная задача вчера была - добавить в конструктор, который принимал один параметр, второй параметр. Если бы у меня было как я показал выше, т.е. существовал бы абстрактный init() предопределенный во всех классах-потомках, мне бы не пришлось исправлять кучу классов-потомков такого вида:
PHP:
class Child {
    public function __constrcut(Object $object, OtherObject $other)
    {
        parent::__constrcut($object, $other);

        // тут то, что должно быть в init()  
    }
}
в итоге все переписал и в целом все мне нравится.
 

Adelf

Administrator
Команда форума
если не сложно, скинь на пастебин какой-нибудь пример родителя и наследника - как было и как ты переписал. Просто интересно.
 

Духовность™

Продвинутый новичок
Было примерно так:
PHP:
abstract class Base_Mapper
{
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }
}

class Module_Common_Mapper_Common extends Base_Mapper {
    // ...
}

class Module_Advert_Mapper_Advert extends Module_Common_Mapper_Common
{
    public function __construct(Database $db)
    {
        parent::__construct($db);

        $this->db_table_name = '...';
        $this->model_class_name = '...';
    }
}
Стало так:
PHP:
abstract class Base_Mapper
{
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
        $this->init();
    }

    abstract protected function init();
}

class Module_Common_Mapper_Common extends Base_Mapper
{
    protected function init(){}; // что бы не объявлять пустышки в классах-потомках, если они не нужны
}

class Module_Advert_Mapper_Advert extends Module_Common_Mapper_Common
{
    protected function init()
    {
        $this->db_table_name = '...';
        $this->model_class_name = '...';
    }
}
 

Adelf

Administrator
Команда форума
PHP:
protected function init(){}; // что бы не объявлять пустышки в классах-потомках, если они не нужны
Ну это мог бы сделать и в основном классе. Смысл то так делать? :)

Принцип понятен. Удобства добавляет... Но в иерархиях все равно придется вызывать init парента. Но плюсов наверно больше, да..
 
Сверху