2013-03-17 3 views
6

Я хочу прояснить проблему я сPHP конструктор наследование

У меня есть базовый класс базы данных, которая будет унаследованной кучей других конструктора classes.The выглядит следующим образом:

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

I будет вызывать из конструктора от детей следующим образом:

public function __construct ($something) 
{ 
    parent::__construct("planets_games"); 
} 

Моя проблема заключается в том, что PHP не позволяет мне сделать конструктор ребенка без параметра $ что-то я получаю следующее:

Fatal error: Declaration of planetsGames::__construct() must be compatible with that of IScaffold::__construct() 

я в настоящее время в обход этого, инстанцировании объект вроде этого:

$pg = new planetsGames('uselessStringHereThatHasNoUtilityAtAll'); 

Я думаю, что я что-то очень важное в моей основной PHP знаний

Спасибо отсутствует вы очень за помощь заблаговременно

+0

Да PHP в настоящее время является строгим, что параметр конструкт дочерний класс должен быть совместим с у родителей. И что вы не получаете? Вы не можете сделать что-то подобное, но да, у вас нет аргументов как для родителя, так и для ребенка; но передать аргументы родителям только из конструкции ребенка. Это то, что вы хотите? –

ответ

5

Это сообщение об ошибке относится к liskov substitution principle. Это относится ко всем отношениям IS-A (что означает использование наследования (extends)) и указывает, что каждый подтип должен быть полностью заменен для супертипа.

Но это не относится к конструкторам! Какую версию php вы используете?

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

Вы не должны отмечать конструкторы абстрактными, окончательными или помещать их в интерфейсы!

В большинстве языков это невозможно сделать.

Что вы должны забрать из этого является то, что лучшими практиками является то, что каждого конкретного объекта имеет конструктор, с подписью, что лучше представляет, как потребитель должен полностью создать экземпляр этого конкретные объекта. В некоторых случаях, когда используется наследование, «заимствование» конструктора родителей является приемлемым и полезным. Кроме того, это рекомендует, чтобы при подклассе определенного типа ваш новый тип должен, когда это уместно, иметь свой собственный конструктор, который делает смысл новым подтипом.

http://ralphschindler.com/2012/03/09/php-constructor-best-practices-and-the-prototype-pattern

+0

Извините за поздний ответ. Я использую версию 5.3.13 – user1840302

+0

Не LSP подходит только тогда, когда мы говорим о полиморфизме? Моя первоначальная мысль была такой же, но это конструктор, а не обычный метод. У нас нет контрактов для конструкторов, не так ли? – zerkms

+0

Нет, но в php вы можете отметить абстракторы конструкторов. Я думаю, что в суперклассе (IScaffold?) в приведенном выше примере это так, в противном случае фатальный не произойдет. Создание абстрактного конструктора приводит к тому же ограничению от LSP. Я думаю, что это плохая практика, как я сказал выше. –

Смежные вопросы