Нужно ли обращаться к конструктору наследуемого класса?

Всем привет.

Вот пример, который вызвал сомнения в моих действиях:
abstract class A extends PDO{
    public function __construct(){
        // устанавливаем соединение с бд
    }
...
}
class B extends A{
    function __construct(){
        parent::__construct();
    }
// используем методы из A

}


Суть в том, что если в классе B не использовать такой конструктор, то вылезает ошибка:

Call to a member function prepare() on null in


По идее абстрактных классов - их нельзя инициализировать. Это то, что мне нужно. Но я бы хотел, чтобы при наследовании такого абстрактного класса запускалась функция типа конструктора, без вызова конструктора в дочернем классе, как у меня в примере. Возможно ли такое?
  • Вопрос задан
  • 313 просмотров
Пригласить эксперта
Ответы на вопрос 4
Denormalization
@Denormalization
Можно через рефлексию, можно через магические методы. Но имхо это хреновый путь, так как такое вот "магическое" поведение влечет за собой ошибки в дальнейшем.

Лучше ЯВНО вызывать все нужные методы, не забыв прописать этот метод в интерфейсе, тогда уж точно никаких проблем не будет.
Ответ написан
riky
@riky
Laravel
Но я бы хотел, чтобы при наследовании такого абстрактного класса запускалась функция типа конструктора, без вызова конструктора в дочернем классе, как у меня в примере. Возможно ли такое?


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

любой адекватный разработчик конечной логики, обязан смотреть конструкторы и разбираться или он сам все инитит или просто вызывает родительский. тем более что родительский может еще и параметры принимать.
Ответ написан
@kiff86 Автор вопроса
А может ли быть метод __counstract - абстрактным? Так как в абстрактном классе абстрактный метод принуждает к обязательному объявлению его в дочернем классе.
Ответ написан
profesor08
@profesor08 Куратор тега PHP
Если вам нужен конструктор чтоб вызвать конструктор родителя, то значит вам не нужен конструктор, и вы можете его убрать из класса. И тогда, при создание объекта класса наследника, вызовится конструктор по умолчанию, тоесть конструктор родителя, или пра-родителя, или пра-пра-пра...
abstract class A extends PDO{
    public function __construct(){
        // устанавливаем соединение с бд
    }
...
}
class B extends A{

}

$o = new B();
$o->query("drop database master");
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы