2010-11-07 15 views
6

Salut J'ai une question concernant $ this.classes PHP étendre

class foo { 

    function __construct(){ 

     $this->foo = 'bar'; 

    } 

} 

class bar extends foo { 

    function __construct() { 

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

    } 

} 

serait

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

résultat dans bar ??

Je demande seulement en raison de je pensais que ce serait, mais à part de mon script ne semble pas aboutir à ce que je pensais.

Répondre

10

Pour citer le PHP manual:

Note: constructeurs de parents ne sont pas appelés implicitement si la classe enfant définit un constructeur. Pour exécuter un constructeur parent, un appel à parent :: __ construct() dans le constructeur enfant est requis.

Cela signifie que dans votre exemple lorsque le constructeur de bar fonctionne, il ne fonctionne pas le constructeur de foo, donc $this->foo est encore mal défini.

5

PHP est un peu étrange en ce qu'un parent constructor is not automatically called if you define a child constructor - vous devez l'appeler vous-même. Ainsi, pour obtenir le comportement que vous souhaitez, faites ceci

class bar extends foo { 

    function __construct() { 

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

    } 

} 
+0

Un peu étrange, mais très flexible puisque vous pouvez facilement ne pas surcharger du tout (appeler seulement le parent) , surchargez partiellement le constructeur (en l'appelant depuis le nouveau) ou surchargez-le complètement (sans l'appeler du tout). Donc, même si c'est bizarre par rapport à d'autres langues, cela ne veut pas dire que c'est bizarre (cela peut être vu comme un énorme avantage) ... – ircmaxell

+0

Alors, ça n'a pas de sens onece la classe étendue est appelée? Je pensais que cela emporterait ses objets avec lui. –

+0

Non, $ continue à référencer l'instance en cours –

0

Vous ne créez pas d'instance de foo et de barre. Créer une seule instance de barre.

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

et que d'autres réponses ont souligné, parent d'appel :: __ construct() dans le constructeur de votre barre