2012-10-29 10 views
15

Nel PHP Constructors and Destructors documentation si affermaI costruttori genitori hanno chiamato se una classe figlia NON definisce un costruttore?

Nota: costruttori Parent non sono chiamati implicitamente se la classe figlia definisce un costruttore. Per eseguire un costruttore genitore, è richiesta una chiamata a parent :: __ construct() all'interno del costruttore figlio.

Ma se la classe figlio non chiama un costruttore, verrà ancora chiamato il costruttore padre? O dovremmo creare un costruttore che chiama comunque il costruttore genitore?

IE:

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

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

risposta

14

Forse è per questo tipo di ovvio, ma ha fatto un po 'di guardarsi intorno, e una risposta diretta a questa domanda sorprendentemente non è stato molto facile da trovare così qui è:

Se la classe figlio fa NON definisce un costruttore quindi verrà chiamato il costruttore genitore.

Nell'esempio seguente $ obj chiamerà comunque il costruttore da BaseClass perché SubClass non ha mai chiamato un costruttore.

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

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

$obj = new SubClass(); 
+1

Forse [il manuale] (http://www.php.net/manual/en/language.oop5.decon.php) è stato aggiornato più di recente, ma lo stato è "Se il bambino non definisce un costruttore quindi può essere ereditato dalla classe genitore proprio come un normale metodo di classe (se non è stato dichiarato come privato). " – MrWhite

+0

@ w3d Grazie per l'aggiornamento :). –

+0

Puoi addirittura dichiarare un costruttore come privato? Ciò sembra sconfiggere lo scopo di avere una classe in primo luogo. – eggmatters

6

Prendere in considerazione un costruttore è un metodo che può essere sovrascritto come qualsiasi altro metodo. Se la classe genitore ha un costruttore, tutte le sue classi figlie erediteranno quel costruttore. Se un figlio esegue l'override del costruttore, questo verrà utilizzato durante la creazione di nuovi oggetti e il costruttore del genitore non viene chiamato implicitamente. Se il figlio non sovrascrive il costruttore, verrà utilizzato il costruttore del genitore. Questo concetto si applica all'ereditarietà multipla.

Problemi correlati