Neraida: PHP Klassen

Guten Tag,

Ich habe zwar schon öfters mit Klassen gearbeitet, allerdings versuche ich jetzt gerade erst ein kleines Projekt konsequent in OOP mit PHP umzusetzen und bin da auf ein kleines Problem gestoßen, von dem ich nicht weiß wie ich es zu lösen habe.

Folgender Aufbau:

Instanz der Klasse 1 hat als Klassenattribute die Instanzen zweier weiterer Klassen, also ist sowas möglich: $KlasseEins->KlasseZwei->Funktion_von_Klasse2(); als auch $KlasseEins->KlasseDrei->Funktion_von_Klasse3();

Nun muss ich aber in der Funktion von Klasse2 auf Daten aus Klasse 3 zugreifen, also müsste ich in der Funktion_von_Klasse2 sowas schreiben wie:
echo $KlasseEins->Klasse3->Klassenattribut_von_Klasse3;, was aber nicht geht, da mir PHP den Dienst mit

Notice: Undefined variable: KlasseEins in  
  
Notice: Trying to get property of non-object in 

versagt. Was genau kann ich tun, damit solche Sachen nicht auftreten?

  1. Hi,

    Nun muss ich aber in der Funktion von Klasse2 auf Daten aus Klasse 3 zugreifen, also müsste ich in der Funktion_von_Klasse2 sowas schreiben wie:
    echo $KlasseEins->Klasse3->Klassenattribut_von_Klasse3;, was aber nicht geht

    Warum sprichst du die Instanz von Klasse1 an der Stelle nicht einfach mit $this an?

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Warum sprichst du die Instanz von Klasse1 an der Stelle nicht einfach mit $this an?

      Weil ich mit $this innerhalb der Funktion test() von Klasse Zwei lediglich auf die Instanz von Klasse zwei zugreifen kann, nicht auf die übergeordnete von Klasse eins.

      Nocheinmal: Klasse1->Klasse2->test() soll auf Klasse1->Klasse3->Attribut_irgendwas zugreifen können ...

      1. Moin!

        Warum sprichst du die Instanz von Klasse1 an der Stelle nicht einfach mit $this an?

        Weil ich mit $this innerhalb der Funktion test() von Klasse Zwei lediglich auf die Instanz von Klasse zwei zugreifen kann, nicht auf die übergeordnete von Klasse eins.

        Nocheinmal: Klasse1->Klasse2->test() soll auf Klasse1->Klasse3->Attribut_irgendwas zugreifen können ...

        Wenn das so sein soll, dann ist dein Klassenkonstrukt kaputt.

        Zunächst einmal: Klasse 2 und Klasse 3 wissen nichts voneinander. Sollten sie jedenfalls nicht. Alles, was eine Klasse von außen wissen will, reicht man ihr über Parameter ihrer öffentlichen Funktionen hinein (inkl. des Konstuktors, der zählt auch dazu). Alles, was eine Klasse wieder nach außen geben soll, wird als Rückgabewert von öffentlichen Funktionen ausgegeben.

        Weiterhin ist es fehlerhaft, von außen her zu viel über die Interna einer Klasse zu wissen. Dein Code außerhalb weiß zuviel über Klasse 1, nämlich dass dort die Klassen 2 und 3 enthalten sind, man auf sie zugreifen kann, und du das auch tust.

        Daraus entsteht dein aktuelles Problem: Weil du auf Klasse 2 in Klasse 1 direkt zugreifst, und Klasse 3 ebenfalls verfügbar ist, und du jetzt ein Problem lösen willst, wo Klasse 3 Infos aus Klasse 2 benötigt, und dein Entwicklungsmuster derzeit ist: "Dann greife ich da einfach rein und hole es mir".

        Korrekt wäre es, niemals etwas in der Art Klasse1->Klasse2... aufzurufen, weil das bedeutet, dass du weißt, das Klasse 2 in Klasse 1 ist. Korrekt wäre, Klasse1->tuwas() aufzurufen, und diese Funktion nutzt dann die nur intern verfügbaren Klassen 2 und 3 zur Aufgabenlösung. Und die Klasse 1 kann sich mit so einem Ansatz auch drum kümmern, aus Klasse 2 die Infos zu besorgen, die Klasse 3 benötigt, indem zuerst Klasse 2 befragt wird, und das Ergebnis dann als Parameter in Klasse 3 übergeben wird.

        Sofern es sich bei dem Ergebnis von Klasse 2 um ein Objekt handelt, landet sogar dasselbe Objekt in Klasse 3 und kann verändert werden - Objekte werden immer als Referenz übergeben, nicht als Kopie. Wollte man eine Objektkopie, müsste man es mit clone() duplizieren.

        - Sven Rautenberg

        1. Moinmoin!

          Das kann ich mir jetzt mal nich verkneifen:
          Klasse erklärt.

          --
          Signaturen sind blöd!
  2. hi,

    Instanz der Klasse 1 hat als Klassenattribute die Instanzen zweier weiterer Klassen, also ist sowas möglich: $KlasseEins->KlasseZwei->Funktion_von_Klasse2(); als auch $KlasseEins->KlasseDrei->Funktion_von_Klasse3();

    Soweit OK, habe ich täglich sowas ;)

    Nun muss ich aber in der Funktion von Klasse2 auf Daten aus Klasse 3 zugreifen, also müsste ich in der Funktion_von_Klasse2 sowas schreiben wie:

    Davon rate ich ab, das wird schwer durchschaubar. Machs besser so, dass Du die Daten von Klasse3 und Klasse2 in der ersten Klasse zusammenführst, also alle notwendige Operationen in der ersten Klasse durchführst. Die Instanzen der Klassen 2 und 3 hast Du ja als Attribute in der Instanz der ersten Klasse, so dass Du damit die Methoden der Klassen 2/3 aufrufen kannst.

    Hotti

  3. Tach!

    Instanz der Klasse 1 hat als Klassenattribute die Instanzen zweier weiterer Klassen, also ist sowas möglich: $KlasseEins->KlasseZwei->Funktion_von_Klasse2(); als auch $KlasseEins->KlasseDrei->Funktion_von_Klasse3();

    Nun muss ich aber in der Funktion von Klasse2 auf Daten aus Klasse 3 zugreifen, also müsste ich in der Funktion_von_Klasse2 sowas schreiben wie:

    Referenzieren auf eine Objektinstanz ist immer nur in eine Richtung vorgesehen. Der rückwärtige Weg wäre auch nicht ganz einfach, weil solche Referenzen unter anderem auch in einfachen Variablen und außerdem an vielen Stellen gehalten werden können. Eine Referenz verwaltet nur einen Zähler, wie oft auf sie verwiesen wird, nicht aber wer das macht.

    Wenn Klasse2 keine Referenz auf das Objekt der Klasse3 kennt, kannst du darauf nicht zugreifen. Vielleicht ist dein Objektmodell nicht optimal, wenn du solche verschachtelten Abhängigkeiten benötigst.

    dedlfix.