2009-06-24 5 views
0

Betrachten Sie die folgende SituationParameterized Constructor Cascading

class URISplit { 

    var $REQ_URI; 

    //some more variables 

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

und die folgende

class URIResolve extends URISplit { 

    //some variables 

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

und andere

class PageControl extends URIResolve { 

    //some variables 

    function __construct($uri) { 

     //some more code 

    } 
} 

und jetzt die folgende Aussage

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

wird diese Aussage die korrekte Konstruktion aller Klassen sicherstellen.

Mit anderen Worten, Konstruktoren von class URISplit und class URIResolve verwenden die Zeichenfolge, die an class PageControl 's-Konstruktor geliefert wird, und führen die richtige Konstruktion aus.

Mein Ziel ist es, nur ein Objekt class PageControl zu erstellen und zu entspannen und zu sehen, es die Arbeit zu tun. Arbeit bedeutet ->

  1. Spaltung der URI (done von class URISplit)
  2. Lösung es (wo die Daten zu holen, was das heißt, ob seine eine Stelle gefragt wird, Seite, Nachrichten, oder irgendetwas anderes) (done durch class URIResolve)
  3. Laden entsprechende Header, Seiten und andere Seite Komponenten (von Funktionen erfolgt in class PageControl

Puh! Lange Frage!

Antwort

2

Y Sie sollten den übergeordneten Konstruktor explizit vom untergeordneten Konstruktor aufrufen. Sehen Sie sich this site als Beispiel an.

Der Grund ist, dass die untergeordnete Klasse auswählen kann, dem übergeordneten Konstruktor verschiedene Argumente zu geben.

Heck, es ist sogar möglich, eine

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

class URIResolve extends URISplit { 

    //some variables 

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

aber den Parameter ($ uri), die durch benötigt wird Alle drei Klassen im Code meiner Frage werden dem Basisklassenkonstruktor übergeben. wird dies direkt in childest Klassenkonstruktor – OrangeRind

+0

sein, oh richtig! Also kaskadieren die Konstruktoren nicht wie in Java/C++ oder ist der Artikel auf Ihrer Verbindung nur für Fälle, in denen parametrisierte Konstruktoren beteiligt sind? Das bedeutet, dass zuerst die Standardkonstruktoren geladen werden und dann, wenn die Steuerung zur übergeordneten Klasse zurückkehrt, wir den parametrisierten Konstruktor der Kindklasse explizit aufrufen? – OrangeRind

+1

Das stimmt. Der Link in middus 'Antwort (zu den autorisierenden PHP-Dokumenten - schaut mal rein!) Zeigt auch diesen Kommentar: "Hinweis: Elternkonstruktoren werden nicht implizit aufgerufen, wenn die Kindklasse einen Konstruktor definiert. Um einen Elternkonstruktor auszuführen, a Aufruf an Parent :: __ construct() innerhalb des Child-Konstruktors ist erforderlich " – xtofl

3

Ich denke, haben, sollten Sie Anrufe an den übergeordneten Konstruktor hinzufügen, wie in http://php.net/manual/en/language.oop5.decon.php beschrieben

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

, aber der Parameter ($ uri), der von allen drei Klassen im Code meiner Frage benötigt wird, wird an den Basisklassenkonstruktor übergeben. wird dies direkt in childest Klassenkonstruktor verfügbar sein – OrangeRind