von Kind-Klasse auf Attribut der Mutter-Klasse zugreifen
Geizhals » Forum » Programmierung » von Kind-Klasse auf Attribut der Mutter-Klasse zugreifen (20 Beiträge, 191 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
....
Re(4): von Kind-Klasse auf Attribut der Mutter-Klasse zugreifen
18.09.2007, 23:11:21
jein. es ist ein bissl verwirrend, ich mit den richtigen termini nicht mehr so ganz vertraut.

also, es ist wichtig, hier zwischen 2 arten von hierarchien zu unterscheiden:
1) der klassenhierarchie (hier gilt der scope resolution operator) und
2) der objekthierarchie

das ist etwas völlig unterschiedliches! MJFox will in der objekthierarchie herumwerken, nicht in der klassenhierarchie!

eine klassenhierarchie kommt wie folgt zustande:


class A {
  public function foo( $value ) {
    echo 'Klasse A sagt: ' . $value;
  }
}

class B extends A {
  public function bar( $value ) {
    parent::foo( $value );
  }

  public function boo( $value ) {
    A::foo( $value );
  }
}
$x = new A();
$y = new B();

$x->foo( 'haha' ); // ergibt "Klasse A sagt: haha" - hier wird nur die methode A::foo aufgerufen
$y->foo( 'hihi' ); // ergibt "Klasse A sagt: hihi" - hier wird nur die methode A::foo aufgerufen
$y->bar( 'hoho' ); // ergibt "Klasse A sagt: hoho" - hier wird die methode B::bar aufgerufen, welche ihrerseits A::foo aufruft, weil B von A abgeleitet wird
$y->boo( 'huhu' ); // ergibt "Klasse A sagt: huhu" - hier wird die methode B::boo aufgerufen, die die methode A::foo aufruft - auch wenn B NICHT von A abstammen würde

anzumerken ist, dass sich php bei dem aufruf von $y->boo( ... ) aufregen würde, da die methode A::foo nicht als "static" deklariert ist. statische methoden sind im grunde nicht viel was anderes als normale funktionen, die in einer klasse zusammengefasst wurden.

die klassenhierarchie entsteht hier durch vererbung. aufgerufen wird die methode der klasse, von der die aktuelle klasse abgeleitet wurde.

die objekthierarchie allerdings ist etwas ganz anderes. ein beispiel eines binären baumes:

class BTree {
  var $value, $left, $right;

  public function __construct( $value, $left = false, $right = false ) {
    $this->value = $value;
    $this->left = $left;
    $this->right = $right;
  }

  public function __toString() {
    $output = $this->value . ", ";
    if ( $this->left ) $output .= '' $this->left->__toString();
    if ( $this->right ) $output .= '' $this->right->__toString();
    return $output;
  }
}
$leftBranch = new BTree( 'linker Ast' );
$rightBranch = new BTree( 'rechter Ast' );
$root = new BTree( 'root', $leftBranch, $rightBranch );

echo $root; // ergibt: "root, linker Ast, rechter Ast, "


hierbei handelt es sich um eine objekt-hierarchie, in der $root der vater von $leftBranch und $rightBranch ist. eine solche "hierarchie" muss keine sein, es kann sich auch um z.b. ringe handeln. die frage war: weiss ein BTree objekt automatisch, welches objekt sein vater ist? nein, natürlich nicht - jeder BTree weiss nur, wer seine kinder sind.

in $rightBranch (also BTree) ->__toString() die methode parent::__toString() aufzurufen, hätte überhaupt keinen sinn - denn damit würde nicht die __toString() methode von $root aufgerufen werden, sondern die __toString() methode der klasse object aufgerufen werden (soweit ich weiss sind alle php-klassen kind-klassen der object-klasse, aber ich hab das verhalten nie genau ausprobiert).


$a = new BTree( 'kind' );
$b = new BTree( 'boo', $a );
$c = new BTree( 'foo', $a );


in diesem fall hätte $a zwei eltern, also zwei referenzen, die auf dieses objekt zeigen. wo würde parent jetzt hinzeigen, falls parent das elternobjekt referenzieren würde?

ergo: klassen und objekthierarchie NICHT VERMISCHEN! das eine hat mit dem anderen nix zu tun.

ps: der gesamte code ist aus dem gedächtnis geschrieben und nicht getestet. ich übernehm also keine haftung |-D

Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung