PHP: mehrstufige constructor-reihenfolge

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/php_mehrstufige_constructor-reihenfolge_92575/page_1 - zur Vollversion wechseln!


atrox schrieb am 14.09.2003 um 22:18

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

das hat den vorteil, daß der constructor nicht wissen muß, wovon ich die klasse abgeleitet habe.

aber wehe! wehe! wenn bar, das selbe konstrukt verwendet, um seinen parent-constructor aufzurufen.

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();

statt der erwarteten ausgabe
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
erhält man folgendes:
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

im nachinein ist eh alles klar, aber ärgern tut es einem schon.

ich kann nichteinmal folgendes benutzen, weil sich nicht herausfinden läßt, auf welcher ebene der verschachtelten vererbung ich mich befinde
Code:
function get_ancestors ($class) {
           
      for ($classes[] = $class; 
           $class = get_parent_class ($class); 
           $classes[] = $class);
      return $classes;
}


vossi schrieb am 14.09.2003 um 22:39

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


atrox schrieb am 14.09.2003 um 22:47

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)


Ringding schrieb am 14.09.2003 um 23:52

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.


gue schrieb am 15.09.2003 um 00:01

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();

$me beinhaltet leider immer nur den Namen der aktuellen Klasse und ein get_class($me) würde nicht funktionieren. Dennoch würde das obere Codestück folgendes ausgeben:

Code:
A:hier ist a, ich habe keinen parent


vossi schrieb am 15.09.2003 um 00:21

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 :)


flaimo schrieb am 15.09.2003 um 01:40

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