"We are back" « oc.at

PHP: mehrstufige constructor-reihenfolge

atrox 14.09.2003 - 22:18 975 6
Posts

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
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;
}
Bearbeitet von atrox am 15.09.2003, 01:32 (s/contructor/constructor/)

vossi

been there, done that
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 1436
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

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
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)
Bearbeitet von atrox am 14.09.2003, 23:42

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
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

Addicted
Avatar
Registered: Feb 2003
Location: Linz
Posts: 400
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

been there, done that
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 1436
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

ILFTKYS
Avatar
Registered: Dec 2001
Location: ask a ninja
Posts: 872
mit php5 wird dein problem gelöst sein. da rufst nur mehr parent::__construct() auf
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz