Innerhalb einer Klasse auf Instanz anderer Klasse zugreifen
Philipp Grashoff
- php
Hi Forumler,
ich versuche gerade vergebens, innerhalb einer Klassendefinition auf eine Instanz einer Anderen Klasse zuzugreifen. Etwa so:
$db1 = new Db();
class blabla {
...
...
...
function sach() {
$db1->tudies();
}
}
Nun wollte ich fragen, ob so etwas generell unmöglich ist, oder ob es da einen Trick oder so gibt, so etwas tun zu koennen
mfg
Philipp
Moin!
ich versuche gerade vergebens, innerhalb einer Klassendefinition auf eine Instanz einer Anderen Klasse zuzugreifen. Etwa so:
$db1 = new Db();
class blabla {
...function sach() {
$db1->tudies();
}
}Nun wollte ich fragen, ob so etwas generell unmöglich ist, oder ob es da einen Trick oder so gibt, so etwas tun zu koennen
Deine Vorgehensweise ist ziemlich übel in meinen Augen. Und deshalb vermutlich nicht von Erfolg gekrönt (zum Glück).
Sinn von objektorientierter Programmierung ist ja, dass man auf interne Abläufe eines Objekts keine Rücksicht mehr nehmen muß.
Wenn man aber deine Klasse blabla einsetzen will, muß man vorher zwingend eine Instanz der Klasse Db mit dem vorgeschriebenen Namen $db1 instantiieren. Das ist böse.
Lösung: Übergib der Methode sach() eine Referenz auf die Db-Instanz. Dann kannst du innerhalb der Methode auf diese Instanz unter einem anderen Namen zugreifen, erhälst aber die namensmäßige Unabhängigkeit.
- Sven Rautenberg
also schlecht ist der Stil sicher, aber es gibt durchaus Probleme in denen das eine angemessene Lösung ist.
Kommentar zu mir: global ist nur sehr sehr mit vorsicht innerhalb von objecten zu benutzen, denn schnell zerstört man hiermit das OOP Konzept und der Quellcode wird unleserlich.
Aber, und das vermisse ich hier öft, ist es doch Sinn hier zu helfen und den Lösungsweg nicht von vornherein zu verurteilen.
Hallo Bastian,
Kommentar zu mir: global ist nur sehr sehr mit vorsicht innerhalb von objecten zu benutzen, denn schnell zerstört man hiermit das OOP Konzept und der Quellcode wird unleserlich.
Aber, und das vermisse ich hier öft, ist es doch Sinn hier zu helfen und den Lösungsweg nicht von vornherein zu verurteilen.
richtig, und eine der besten Hilfen, die man geben kann, ist die Vermittlung von Kenntnissen in der Programmiertechnik und genau das hat Sven getan.
Philipp seine Lösung ist nur gültig für PHP und nur gültig für seinen speziellen Fall. Sven seine Lösung ist allgemeingültig. Gültig für andere Anwendungsfälle und auch gültig für andere Programmiersprachen.
:-) und deine Lösung vergisst, dass man auf jede globale Variable mit $GLOBALS zugreifen kann.
Tja, mein Lösungsansatz wäre sogar ein ganz anderer. Ich stehe auf dem Standpunkt, dass eine Klasse, die zwingend eine Instanz einer Datenbankklasse benötigt, von dieser Klasse auch abgeleitet sein sollte.
Dann kümmert sich die Klasse selbst darum, dass bei Bedarf die notwendige Verbindung hergestellt wird. Das hat den Vorteil, dass die Klasse auch immer eine gültige Verbindung zur Verfügung hat bzw. die entsprechende Fehlerbehandlung beinhaltet.
Bei Svens bzw. auch Philipps Lösung muss diese Prüfung auf jeden Fall noch einmal nachgeholt werden.
Viele Grüße
Antje
Hi Sven,
genau das mit den Referenzen habe ich gesucht! Vielen Dank ;)
mfg
Philipp
Also wenn du innerhal einer Methode auf eine variable zugrifen willst, dann muss diese dort sichtbar sein. Sichtbar sind Variablen die:
1. der Methode als Parameter übergeben wurde
foo($variable)
2. in der Methode selbst initialisiert ist
foo() {
$i = 4;
}
3. eine Klassenvariable ist
class fooClass {
$variable = 4;
4. als global in der Methode eingebunden ist
$i = 4;
class fooClass {
foo() {
global $i;
}
..