PHP: mehrstufige constructor-reihenfolge
atrox 14.09.2003 - 22:18 975 6
atrox
in fairy dust... I trust!
|
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: 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. 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 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: 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 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
|
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!
|
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
|
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
|
Also das ist vielleicht keine zufriedenstellende Lösung aber im Notfall kannst du es ja vielleicht so lösen: 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: A:hier ist a, ich habe keinen parent
|
vossi
been there, done that
|
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
|
mit php5 wird dein problem gelöst sein. da rufst nur mehr parent::__construct() auf
|