Tom Collins: Abgeleitete Klassen->Greenhorn kapiert's nicht

Einen schönen guten Abend,

ich versuche gerade, OOP zu verstehen, aber irgendwie hakt's schon am Ansatz.
Folgenden Code habe ich geschrieben, um mir das ganze zu verdeutlichen:

########################

<html>
    <head>
    </head>
    <body>
<?php
class Klasse {
    var $zahl;
    var $ergebnis1;
    var $ergebnis2;

function Klasse($zahl = 0) {
        $this->zahl = $zahl;
        $this->ergebnis1 = $this->zahl - 100;
        $this->ergebnis2 = $this->zahl + 100;
    }
}

class Abgeleitete_klasse extends Klasse {
    var $ergebnis3;

function Abgeleitete_klasse() {
        $this->ergebnis3 = $this->ergebnis1 + $this->ergebnis2;
    }
}

$test = new Klasse(1000);
$test_abgeleitet = new Abgeleitete_klasse(1000);
echo("
    <h1>Klasse</h1>
    <pre>
        Zahl       = $test->zahl      // ergibt 1000
        Ergebnis 1 = $test->ergebnis1 // ergibt 900
        Ergebnis 2 = $test->ergebnis2 // ergibt 1100
    </pre>
    <h1>Abgeleitete_klasse</h1>
    <pre>
        Zahl       = $test_abgeleitet->zahl      // ergibt nichts
        Ergebnis 1 = $test_abgeleitet->ergebnis1 // ergibt nichts
        Ergebnis 2 = $test_abgeleitet->ergebnis2 // ergibt nichts
        Ergebnis 3 = $test_abgeleitet->ergebnis3 // ergibt 0, logisch
    </pre>
");

?>
    </body>
</html>

################

Wenn nun die 'Abgeleitete_klasse' die Eigenschaften und Methoden von 'Klasse' erbt, sollten dem Konstruktor von 'Abgeleitete_klasse' doch auch '$zahl', '$ergebnis1' und '$ergebnis2' bekannt sein. Sind se aber nicht, und ich begreife einfach nicht, warum.

Habe ich was übersehen? Habe ich was total falsch verstanden? Habe ich was im Forum überlesen?

Hilflose Grüße von TomC

  1. Hallo Tom,

    class Klasse {
        var $zahl;
        var $ergebnis1;
        var $ergebnis2;

    function Klasse($zahl = 0) {
            $this->zahl = $zahl;
            $this->ergebnis1 = $this->zahl - 100;
            $this->ergebnis2 = $this->zahl + 100;
        }
    }

    class Abgeleitete_klasse extends Klasse {
        var $ergebnis3;

    function Abgeleitete_klasse() {
            $this->ergebnis3 = $this->ergebnis1 + $this->ergebnis2;
        }
    }

    $test = new Klasse(1000);
    $test_abgeleitet = new Abgeleitete_klasse(1000);

    [...]

    Wenn nun die 'Abgeleitete_klasse' die Eigenschaften und
    Methoden von 'Klasse' erbt, sollten dem Konstruktor von
    'Abgeleitete_klasse' doch auch '$zahl', '$ergebnis1' und
    '$ergebnis2' bekannt sein. Sind se aber nicht, und ich
    begreife einfach nicht, warum.

    Nun, Objekte erstellen Instanzen von Klassen. Und die Klassen-Variablen sind Instanz-abhaengig. Will heissen: in
    $test_abgeleitet sind die Variablen von $test_abgeleitet
    nicht verfuegbar. Ausserdem wird der Konstruktor von der Klasse 'Klasse' bei der Erstellung einer Instanz der Klasse
    'Abgeleitete_Klasse' nicht ausgefuehrt -- das musst du schon
    von Hand machen.

    Gruesse,
     CK

    --
    http://cforum.teamone.de/
    http://wishlist.tetekum.de/
    If God had meant for us to be in the Army, we would have been born with green, baggy skin".
    1. Moin CK,

      danke für den nächtlichen Tipp.
      Nochmal zum Aufräumen:

      Wenn ich eine Instanz der Subklasse erzeugen will, muss dessen Konstruktor erstmal eine Instanz der Basisklasse erzeugen, damit er weiß, auf welcher Basis er arbeiten soll.

      Oder, bildlich gesprochen:
      Wenn ich eine Scheibe Kuchen
          (=Instanz der Subklasse erzeugen;
          die Subklasse selbst beschreibt,
          wie man eine Scheibe von einem Kuchen abschneidet)
      essen will, muss ich erst des Rezept für einen Kuchen
          (=Basisklasse)
      lesen und einen Kuchen backen
          (=Instanz der Basisklasse erzeugen),
      da ich mir keine Scheibe von einem Kuchen abschneiden kann,
      von dem ich nur das Rezept gelesen habe. Richtig?

      Uff.

      Kaffegrüße von TomC

      1. So funktioniert's jetzt:

        <?php
        class Klasse {
            var $zahl;
            var $ergebnis1;
            var $ergebnis2;

        function Klasse($zahl = 0) {
                $this->zahl = $zahl;
                $this->ergebnis1 = $this->zahl - 100;
                $this->ergebnis2 = $this->zahl + 100;
            }
        }

        class Abgeleitete_klasse extends Klasse {
            var $ergebnis3;

        function Abgeleitete_klasse($zahl) {
                $this->Klasse($zahl);
                $this->ergebnis3 = $this->ergebnis1 + $this->ergebnis2;
            }
        }

        $test = new Klasse(1000);
        $test_abgeleitet = new Abgeleitete_klasse(2000);
        echo("
            <h1>Klasse</h1>
            <pre>
                Zahl       = $test->zahl
                Ergebnis 1 = $test->ergebnis1
                Ergebnis 2 = $test->ergebnis2
            </pre>
            <h1>Abgeleitete_klasse</h1>
            <pre>
                Zahl       = $test_abgeleitet->zahl
                Ergebnis 1 = $test_abgeleitet->ergebnis1
                Ergebnis 2 = $test_abgeleitet->ergebnis2
                Ergebnis 3 = $test_abgeleitet->ergebnis3
            </pre>
        ");

        ?>

        Vielen Dank nochmal für's Gehirnwindungen sortieren!
        TomC