2012-10-29 8 views
15

W PHP Constructors and Destructors documentation stwierdzaCzy konstruktory nadrzędne są wywoływane, jeśli klasa podrzędna NIE definiuje konstruktora?

Uwaga: konstruktorzy rodzic nie nazywa się niejawnie jeśli klasa dziecko określa konstruktor. Aby uruchomić konstruktora macierzystego, wymagane jest wywołanie funkcji parent :: __ construct() w konstruktorze podrzędnym.

Ale co jeśli klasa potomna nie wywoła konstruktora, czy nadal będzie wywoływany konstruktor macierzysty? A może powinniśmy utworzyć konstruktora, który mimo wszystko wywołuje konstruktor macierzysty?

IE:

class BaseClass { 
    function __construct() { 
     print "In BaseClass constructor\n"; 
    } 
} 

class SubClass extends BaseClass { 
    function __construct() { 
     parent::__construct(); 
    } 
} 

Odpowiedz

14

Może to był rodzaj oczywiste, ale niektórzy nie rozglądając się, a bezpośrednia odpowiedź na to pytanie nie była zaskakująco bardzo łatwe do znalezienia, więc tutaj jest:

Jeśli klasa podrzędna ma NOT zdefiniować konstruktor, a następnie zostanie wywołany konstruktor macierzysty.

W poniższym przykładzie $ obj nadal wywoła konstruktor z BaseClass, ponieważ SubClass nigdy nie nazwał konstruktora.

class BaseClass { 
    function __construct() { 
     print "In BaseClass constructor\n"; 
    } 
} 

class SubClass extends BaseClass { 
    //I do not have a constructor :(
} 

$obj = new SubClass(); 
+1

Być może [podręcznik] (http://www.php.net/manual/en/language.oop5.decon.php) został zaktualizowany bardziej niedawno, ale stwierdza: "Jeśli dziecko nie definiuje konstruktor może być odziedziczony z klasy nadrzędnej, podobnie jak metoda z normalną klasą (jeśli nie została zadeklarowana jako prywatna). " – MrWhite

+0

@ w3d Dziękujemy za aktualizację :). –

+0

Czy można nawet zadeklarować konstruktor jako prywatny? Wydaje się, że w pierwszej kolejności pokonano cel posiadania klasy. – eggmatters

6

Weź pod uwagę, że konstruktor jest metodą, która może być nadpisana jak każda inna metoda. Jeśli klasa nadrzędna ma konstruktor, wszystkie jego klasy potomne dziedziczą ten konstruktor. Jeśli dziecko nadpisze konstruktor, będzie ono używane podczas tworzenia nowych obiektów, a konstruktor rodzica nie jest wywoływany niejawnie. Jeśli dziecko nie zastąpi konstruktora, użyjemy konstruktora nadrzędnego. Ta koncepcja dotyczy dziedziczenia wielokrotnego.

Powiązane problemy