Constructor in Extend Class aufrufen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anweisung
aufruf
beispiel
bezeichnung
code
funktion
kind
klasse
methode
nennen
nutz
oberklasse
operator
problem
programmierer
tieferen sinn
tun
url
verwenden
weglassen
-
Hallo,
ich habe folgenden code:
<?php class Default { public function Default() { echo 'Hallo'; //Construktor } //Code } class Case extends Default { public function Case() { echo 'Hallo Case!!'; // Constructor der Kind-Class } // Code } ?>
egal was ich mache, der constructor in der Extend Kind-Class wird nicht ausgeführt. Der in der Elternklasse schon. Hab auch schon im I-net gesucht und nix gefunden, was geht.
ich hoffe ihr könnt mir helfen.
Schöne Grüße
mmc -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Also hier steht wie das geht... Musst unter Vererbung nachschauen.
Ansonsten ist das Schlüsselwort public überflüssig. Kannst du bzw. solltest du weglassen.
UND: Default und Case sind Schlüsselwörter in php. Du darfst diese nicht als Namen für Klassen oder Variablen verwenden. Nenne deine Klassennamen um! Dann sollt es Funktionieren.
Was du noch tun solltest: Den Konstruktor der Vater-Klasse in der Kind-Klasse aufrufen. (sinnvoll, wenn Variablen der Vater-Klasse auch initialisiert werden sollen).
Beitrag zuletzt geändert: 23.10.2010 15:04:56 von tangoal -
@tangoal: Warum sollte das public keyword da überflüssig sein?
@topic: Bitte nutze nicht die PHP 4 Schreibweise für Konstruktoren. Stattdessen nutze:
<?php class Parent { public function __construct() { echo __CLASS__; } } class Child extends Parent { public function __construct() { echo __CLASS__; } } $obj = new Child;
Damit umgehst du auf jeden Fall schonmal Probleme ;)
Beitrag zuletzt geändert: 23.10.2010 22:23:14 von nikic -
@tangoal: Warum sollte das public keyword da überflüssig sein?
Weil es auch ohne funktioniert. Mit funktioniert es auch, also ist es eigentlich auch egal
Damit umgehst du auf jeden Fall schonmal Probleme ;)
Sag mal, was meinst du eigentlich hiermit? Was für Probleme sollten denn auftreten? (könnte mir schon was vorstellen, bin jetzt aber leider kein PHP-Kenner) -
@tangoal: Auch wenn du das public sicherlich weglassen könntest, würde ich es dennoch nicht empfehlen. So siehst du einerseits sofort, dass es public ist und weiterhin arbeitest du dann konsistent. So würdest du dann manchmal ein protected da stehen haben, aber kein public usw. Alle Coding Standards erfordern eine explizite Angabe ;)
Was PHP4-Konstruktor vs. PHP5-Konstruktor angeht: Wahrscheinlich wird normalerweise alles gehen. Du bist aber dennoch nicht wirklich zukunftssicher, da es eben die veraltete Konstruktorschreibweise ist.
Weiterhin bin ich mir nicht sicher, wie da vererbt wird. Zum Beispiel würde in der Child Klasse eine Parent Methode sein (die ja eigentlich der Konstruktor ist)? Und wie rufte ich den Parent-Konstruktor auf? In PHP 5 wäre das ein parent::__construct(); Aber wie geht das mit PHP 4? Müsste man parent::Parent() schreiben?
Zudem wird der PHP 4 Konstruktor seit PHP 5.3.3 nicht mehr als Konstruktor angesehen, sofern sich die Klasse in einem Namespace befindet. Es ist zwar eher unwahrscheinlich, dass du mit einem PHP 4 Konstruktor PHP 5.3 Namespaces nutzen willst, aber es ist dennoch sauberer dies zumindest zu erlauben ;) -
Hast wohl Recht, nikic. Aber das mag ich teils an solchen Skriptsprachen nicht:
Man kann es tun, oder man kann es lassen. Ich sag mal ganz lapidar: "Irgendwie funktioniert es". Und wenn's irgendwann nicht funktioniert, dann muss man das Programm neu schreiben, weil man den Fehler nicht findet. Diese Freiheitsgrade, die durch die Sprache erlaubt werden, müssen durch die Selbstdisziplin des Programmierers eingeschränkt werden. Nicht so einfach, Programmierer sind meist sehr bequemlich...
Nun ja, was PHP 4 angeht: dürfte doch so ziemlich abgelöst sein von PHP 5, oder nicht? Ist also schon sinnvoller gleich Konventionen für Version 5 zu verwenden, auch wenn es mit der "alten Schreibweise" auch funktioniert.
Bei der Vererbung müsste in PHP 4 der Konstruktor der Oberklasse so aufgerufen werden:
Hängt also immer vom Klassennamen der Oberklasse ab. In V 5 kann man das natürlich vereinheitlichen, dann muss man in jeder Child-Klasse immer wieder den gleichen Aufruf tätigen (so wie du es dargestellt hast).parent::Parentklassenname( );
Was ich aber auch ein bisschen merkwürdig finde... Warum das Kind nicht beim Namen nennen, statt immer den gleichen Konstruktornamen zu verwenden? Ist ja eigentlich nur eine Bezeichnung, oder steckt da noch mehr dahinter?
-
yo mey!
@nikic:
das ist schon ganz gut. allerdings 'Parent' ist reserviert! daher (damit es auch funzt ;)<?php class Parent { public function __construct() ... class Child extends Parent { public function __construct() ...}...
Damit umgehst du auf jeden Fall schonmal Probleme ;)
geschmacksache: ich würde namen wie (_)Parent, Child &c. überhaupt nicht wählen.class _Parent { public function __construct() { echo __CLASS__; } } class Child extends _Parent { public function __construct() { echo __CLASS__."<hr />"; parent::__construct (); /* das ruft _Parent auf */ } } $obj = new Child;
lg
joseph
Beitrag zuletzt geändert: 25.10.2010 17:35:52 von nikic -
@czibere: Offensichtlich waren die Namen auch nur zu Demonstrationszwecken gewählt. In der Praxis macht der Name Parent oder Child natürlich absolut gar keinen Sinn (außer man implementiert nu Stammbäume oder so :D)
@tangoal: Nun, genau daher empfehle ich auch den PHP 5 Konstruktor zu nutzen. Der PHP 4 Konstrkutor ist veraltet und wird im weiteren Verlauf wahrscheinlich zuerst Deprecated werden und anschließend ganz entfallen. Da PHP aber ziemlich viel von Abwärtskompatibilität hält ist er vorerst weiterhin verfügbar.
Was ich aber auch ein bisschen merkwürdig finde... Warum das Kind nicht beim Namen nennen, statt immer den gleichen Konstruktornamen zu verwenden? Ist ja eigentlich nur eine Bezeichnung, oder steckt da noch mehr dahinter?
Was du damit meinst verstehe ich nicht so recht. -
@nikic:
Was ich meinte ist: Worin liegt der Vorteil es so zu schreiben:
Und nicht einfach so:public function __construct() { echo __CLASS__; }
Was haben sich die PHP-Leute dabei gedacht? Also für mich sieht es momentan nur so aus, als ob man einfach nur eine andere Bezeichnung für den Konstruktor ausgewählt hat, die allgemein eingesetzt werden kann. Oder gibt es irgendeinen tieferen Sinn dahinter? :-) Sind Bezeichnungen mit zwei Unterstrichen in PHP etwas Besonderes (sehen so aus wie vordefinierte Makros und Defines aus C/C++)?public function Klassenname() { echo Klassenname; }
-
Ja, natürlich hat das einen tieferen Sinn. Die vorherige Variante mit dem Klassennamen hatte die oben angesprochenen Probleme. Also beispielsweise, dass für den Aufruf des Parent-Konstruktors der Name der Parent-Klasse hingeschrieben wurde, obwohl er bereits in der Extend-Anweisung steht. Es wäre also eine unnötige Duplizierung, die die Wartung erschwert (stell dir vor du hast eine Klasse Core und zehn Klassen die davon erben. Wenn du nun den Namen der Klasse in Base ändern würdest, müsstest du nur die extend-Anweisungen ändern (oder wenn du ganz faul bist nicht mal das ;D). So müsstest du aber auch noch die Konstrkutoren nach eventuellen parent:: aufrufen durchforsten.) Weiterhin entstehen logische Probleme wie "Soll ParentKlassenName auch in der Child-Klasse verfügbar sein? Es ist ja eigentlich nur der Konstruktor und somit sollte er durch ChildKlassenName überschrieben werden.) Usw.
Und ja, __X sind reservierte Variablen/Konstanten/Funktionen/Klassen/Methoden. Auf jeden Fall solltest du nie eigene __X Irgendwase habe. __construct ist eine dieser magischen Methoden. Daneben gibt es noch __destruct (in C++ wäre das ~Klassenname()), __get, __set, __isset, __unset (Property Overloading), __call und __callStatic (Method Overloading), __invoke (in C++ wäre das operator()(), also Aufruf der Instanz als wäre es eine Funktion), __clone (für den clone Operator), __sleep, __wakeup und __setState (für Serialisierung und Export) und eventuell etwas, was mir gerade nicht einfällt.
(Ein Beispiel für eine __ Funktion ist __halt_compiler(); Aber das ist auch keine echte Funktion, es ist ein Sprachkonstrukt.)
Beitrag zuletzt geändert: 26.10.2010 18:52:50 von nikic -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage