2010-11-07 19 views
6

Ciao, ho una domanda riguardante $ this.classi php estendere

class foo { 

    function __construct(){ 

     $this->foo = 'bar'; 

    } 

} 

class bar extends foo { 

    function __construct() { 

     $this->bar = $this->foo; 

    } 

} 

farebbe

$ob = new foo(); 
$ob = new bar(); 
echo $ob->bar; 

risultato in bar ??

Chiedo solo perché pensavo che sarebbe, ma a parte il mio copione non sembra comportare quello che pensavo.

risposta

10

Per citare il PHP manual:

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.

Ciò significa che nel tuo esempio, quando il costruttore di bar piste, non viene eseguito il costruttore di foo, così $this->foo è ancora indefinito.

5

PHP è un po 'strano in quanto a parent constructor is not automatically called if you define a child constructor - devi chiamarlo tu stesso. Pertanto, per ottenere il comportamento desiderato, fare questo

class bar extends foo { 

    function __construct() { 

     parent::__construct(); 
     $this->bar = $this->foo; 

    } 

} 
+0

Un po 'strano, ma molto flessibile in quanto si può facilmente non sovraccaricare affatto (chiamare solo il genitore) , sovraccaricare parzialmente il costruttore (chiamandolo dal nuovo) o sovraccaricarlo completamente (non chiamarlo affatto). Quindi, anche se è strano rispetto ad altre lingue, questo non significa che sia strano che lo faccia (può essere visto come un enorme vantaggio) ... – ircmaxell

+0

Quindi $ questo non ha significato in quanto viene chiamata la classe estesa? Pensavo che questo avrebbe portato con sé i suoi oggetti. –

+0

No, $ continua a fare riferimento all'istanza corrente –

0

Non creare un'istanza di foo e bar. Crea una singola istanza di barra.

$ob = new bar(); 
echo $ob->bar; 

e, come altre risposte hanno sottolineato, genitore chiamata :: __ construct() all'interno del vostro costruttore bar