Sven Rautenberg: PHP Klassen

Beitrag lesen

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