URL: https://www.overclockers.at/coding-stuff/php_mehrstufige_constructor-reihenfolge_92575/page_1 - zur Vollversion wechseln!
ich hab schon in einigen anderen threads erwähnt, das ich recht ungluecklich über die art der OOP implementierung in PHP bin. Man verwendet es trotzdem - besser als garnichts.
Wann immer man versucht, ein bishen eleganz hineinzubringen, wird man von php aber brutal gestoppt:
zb wird auf php.net empfohlen vererbte construktoren so aufzurufen:
Code:class foo extends bar { function foo() { // constructor $par = get_parent_class($this); $this->$par(); //... anderer constructor stuff
Code:class A { function A() { $me = get_class($this); echo "A:hier ist $me, ich habe keinen parent\n"; } } class B extends A { function B() { $par = get_parent_class($this); $me = get_class($this); echo "B:hier ist $me, mein parent ist $par\n"; parent::$par(); } } class C extends B { function C() { $par = get_parent_class($this); $me = get_class($this); echo "C:hier ist $me, mein parent ist $par\n"; parent::$par(); } } echo "<PRE>"; new C();
erhält man folgendes:Code:C:hier ist c, mein parent ist b B:hier ist b, mein parent ist a A:hier ist a, ich habe keinen parent
Code:C:hier ist c, mein parent ist b B:hier ist c, mein parent ist b Fatal error: Call to undefined function: b() in c:\inetpub\wwwroot\Portal2\parent-bug.php on line 16
Code:function get_ancestors ($class) { for ($classes[] = $class; $class = get_parent_class ($class); $classes[] = $class); return $classes; }
komisch .. und was ist die logische erklärung dafür das in der Klasse B falsch auf parent::$par(); zugegriffen wird?
am meisten nervt mich das ich die Objekte immer per Referenz übergeben muss sonst wird ein neues Objekt angelegt .. und obs zZ einen Copykonstruktor oder ähnliches gibt hab ich nichtmehr gefunden bzw. gar nicht gesucht als ich von PHP5 hörte
die erklärung ist, daß $this immer auf die instanz von C zeigt, egal welche methode gerade ausgeführt wird. (also immer auf die "oberste" - auf die art und weise, löst php oo-polymorphie)
Ich glaub, die einzige aktuelle Skriptsprache mit einem brauchbaren Klassenkonzept dürfte wohl python sein. Oder hat da wer schlechte Erfahrungen?
Nur wenn man von C++ kommt, dann fühlt man sich eh überall wie mit hundert Metern Stahlkette umwickelt.
Also das ist vielleicht keine zufriedenstellende Lösung aber im Notfall kannst du es ja vielleicht so lösen:
Code:class A { function A($me = "this") { echo "A:hier ist $me, ich habe keinen parent\n"; } } class B extends A { function B($me = "this") { $par = get_parent_class($me); parent::$par($par); } } class C extends B { function C($me = "this") { $par = get_parent_class($this); parent::$par($par); } } echo "<PRE>"; new C();
Code:A:hier ist a, ich habe keinen parent
kann ich nicht zustimmen .. ich fühl mich bei C++ von hundert Metern Stahlkette erdrückt weils mit de dummen Pointer (ich hasse sie) so kompliziert herumtun kannst / musst ..
Java 4 ever 
mit php5 wird dein problem gelöst sein. da rufst nur mehr parent::__construct() auf
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2026