2009-06-24 5 views
0

la situation suivanteparamétrés Constructor Cascading

class URISplit { 

    var $REQ_URI; 

    //some more variables 

    function __construct($uri) { 
     //some code 
     $this->REQ_URI = $uri; 
     //some code yet again 
    } 
} 

et les suivantes

class URIResolve extends URISplit { 

    //some variables 

    function __construct($uri) { 
     //some code 
    } 
} 

et un autre

class PageControl extends URIResolve { 

    //some variables 

    function __construct($uri) { 

     //some more code 

    } 
} 

et maintenant la déclaration suivante

$page = new PageControl($_SERVER['REQUEST_URI']);

cette déclaration assurera-t-elle la bonne construction de toutes les classes. En d'autres termes, les constructeurs de class URISplit et class URIResolve utiliseront la chaîne fournie au constructeur de class PageControl et feront la construction appropriée.

Mon objectif est simplement de créer un objet de class PageControl et détendez-vous et voyez-le faire le travail. Travail signifie ->

  1. partage l'URI (fait par class URISplit)
  2. résoudre (où chercher les données pour ce qui est demandé à savoir si son poste, la page, des nouvelles, ou toute autre chose) (fait par class URIResolve)
  3. têtes chargement appropriées, pages, et d'autres éléments de la page (faites par des fonctions dans class PageControl

Ouf! longue question!

Répondre

2

Y Vous devriez explicitement appeler le constructeur parent de celui de l'enfant. Jetez un oeil à this site pour un exemple.

La raison est que la classe enfant peut choisir de donner au constructeur parent des arguments différents.

Heck, il est même possible d'avoir une

class SOSplit extends URISplit { 
    function __construct() { 
     parent::__construct("http://stackoverflow.com"); 
    } 
} 

class URIResolve extends URISplit { 

    //some variables 

    function __construct($uri) { 
     parent::__construct($uri); 
    } 
} 
+0

mais le paramètre (uri $) qui est nécessaire par Tous les trois classess dans le code de ma question sont fournis au constructeur de la classe de base. sera-t-il directement disponible dans le constructeur de classe d'enfant – OrangeRind

+0

oh right! alors les constructeurs ne sont-ils pas cascadés comme en Java/C++ ou est-ce que l'article sur votre lien ne concerne que les cas où des constructeurs paramétrés sont impliqués? Cela signifie d'abord que les constructeurs par défaut sont chargés, puis lorsque le contrôle revient à la classe parente, nous appelons explicitement le constructeur paramétré par la classe enfant. – OrangeRind

+1

C'est vrai. Le lien dans la réponse de middus (aux docs PHP autoritaires - regardez!) Montre aussi ce commentaire: "Note: Les constructeurs parents ne sont pas appelés implicitement si la classe enfant définit un constructeur. call to parent :: __ construct() dans le constructeur enfant est requis " – xtofl

3

Je pense que vous devriez ajouter des appels au constructeur parent comme décrit dans http://php.net/manual/en/language.oop5.decon.php

class SubClass extends BaseClass { 
    function __construct() { 
    parent::__construct(); 
    print "In SubClass constructor\n"; 
    } 
} 
+0

mais le paramètre ($ uri) requis par les trois classes dans le code de ma question est fourni au constructeur de la classe de base. sera-t-il directement disponible dans le constructeur de classe childest? – OrangeRind

Questions connexes