2013-03-17 6 views
6

chcę wyjaśnić problem mamphp konstruktor dziedziczenie

Mam klasy bazowej bazy danych, która będzie dziedziczona przez kilka innych konstruktora classes.The wygląda następująco:

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

I zadzwoni z tego konstruktora z dziećmi, jak następuje:

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

Moim problemem jest to, że PHP nie pozwala mi zrobić konstruktor dziecka bez parametru $ coś otrzymuję następujący:

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

Jestem obecnie omija to przez instancję obiektu takiego:

$pg = new planetsGames('uselessStringHereThatHasNoUtilityAtAll'); 

Myślę, że jestem brakuje czegoś bardzo ważnego w moim podstawowej wiedzy php

podziÄ ™ kowaniami bardzo za pomoc z góry

+0

Tak php obecnie jest ścisła, że ​​parametr konstrukt klasy podrzędne muszą być kompatybilne do rodzica. A czego nie dostajesz? Nie możesz zrobić czegoś takiego, ale tak, nie możesz mieć argumentów zarówno dla rodzica, jak i dziecka; mimo to przekazuj argumenty rodzicowi tylko z konstrukcji dziecka. Czy jest to coś, czego pragniesz? –

Odpowiedz

5

Ten komunikat o błędzie odnosi się do liskov substitution principle. Dotyczy każdej relacji IS-A (co oznacza użycie dziedziczenia (rozszerzeń)) i stwierdza, że ​​każdy podtyp powinien być w pełni wymienny dla supertypu.

Ale to nie dotyczy konstruktorów! Którą wersję PHP używasz?

Wygląda na to, że klasa podstawowa oznaczyła konstruktor jako abstrakcyjny. To jedyny sposób, aby ten błąd pojawił się.

Nigdy nie należy oznaczać konstruktorów jako abstrakcyjnych, ostatecznych ani umieszczać ich w interfejsach!

W większości języków nie jest to możliwe.

Co należy zabrać z tego jest to, że najlepsze praktyki jest to, że każdy konkretny obiekt ma konstruktora z podpisem, który najlepiej reprezentuje jak konsument powinien w pełni wystąpienia tego konkretnego obiekt. W niektórych przypadkach, w których bierze udział dziedziczenie, "pożyczanie" konstruktora rodziców jest dopuszczalne i użyteczne. Ponadto jest zachęcony, że gdy podklasy określonego rodzaju, że nowy typ powinien, w razie potrzeby, mieć swój własny konstruktor, który sprawia, że ​​ sens najbardziej nowy podtyp.

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

+0

Przepraszam za spóźnioną odpowiedź. Korzystam z wersji 5.3.13. – user1840302

+0

Czy LSP nie nadaje się tylko wtedy, gdy mówimy o polimorfizmie? Moja początkowa myśl była taka sama, ale jest konstruktorem, a nie zwykłą metodą. Nie mamy umów dla konstruktorów, prawda? – zerkms

+0

Nie, ale w php można oznaczyć konstruktory jako abstrakcyjne. Myślę, że w super klasie (IScaffold?) w powyższym przykładzie jest to przypadek, w przeciwnym razie śmiertelne by się nie zdarzyło. Tworzenie abstrakcyjnego konstruktora wiąże się z tymi samymi ograniczeniami z LSP. Myślę, że jest to zła praktyka, o czym pisałem powyżej. –