• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

OOP, 2 Klassen

Status
Für weitere Antworten geschlossen.
Das konzept von dir ist allerdings etwas unflexibel, da man immer die Instanz weiterreichen muss. Mich würde das beim schreiben tierisch nerven.

Vie gesagt, mit einer statischen instanz gehts ganz einfach.

kannst du mir das nochmal genauer erklären?
hab jetzt prophet's referenzen-variante..
 
Das mit den Referenzen ist ein Versuch die Zeiger aus C und C++ abzubilden. Ich finde aber, das es den PHP-Entwicklern nicht wirklich gelungen ist und man sollte meiner Meinung nach die Finger davon lassen. Keiner weiss, wie genau da irgendwelche Variablen im Speicher abgelegt werden und in wieweit Fremdangriffe möglich sind.

Zurück zum Thema.
Ich hatte einige Posts weiter vorne einen kurzen Abriss einer möglichen Datenbankklasse gegeben. Der Gedanke dahinter ist, die Instanz der Datenbankklasse in eine statische Variable zu schreiben um von überall aus Zugriff auf die in der statischen Variable abgelegte Instanz der Klasse zu haben. Es wird also nur ein einziges mal eine Verbindung zum Datenbankserver aufgebaut und aufrecht erhalten.
In jeden Skript, welches Datenbankunterstützung benötigt, wird die Instanz über die Funktion DB :: getInstance() geladen. Man hat also nicht die Mühe die ganze Zeit die Variable mit der Instanz übergeben zu müssen. Sie verbleibt statisch im Speicher bis die Abarbeitung vollkommen beendet ist.
 
Das mit den Referenzen ist ein Versuch die Zeiger aus C und C++ abzubilden. Ich finde aber, das es den PHP-Entwicklern nicht wirklich gelungen ist und man sollte meiner Meinung nach die Finger davon lassen. Keiner weiss, wie genau da irgendwelche Variablen im Speicher abgelegt werden und in wieweit Fremdangriffe möglich sind.
Das system ist ziemlich überschaubar. Im übrigen werden nicht die Zeiger sondern Referenzen wie es sie auch in Java und C++ gibt nachgebildet. Wo die variablen im SPeicher liegen weist du nie. Was ist daran nicht gelungen? Es ist wie geplant ein verweis auf das original. Das funktioniert einwandfrei!

Damit deine Statische variante funktioniert musst du trotzdem die gesamte klasse statsich machen und nicht nur die variable. So wie du es gepostet hast müsstest du trotztdem noch eine Instanz weiterreichen damit man zugriff auf die Zugriffsfunktionen hat (was ja nicht sinn der sache ist!). Sonst müsstest du die angelegte instanz global machen und wir wären wieder bei meinem ersten lösungsvorschlag.
 
Damit deine Statische variante funktioniert musst du trotzdem die gesamte klasse statsich machen und nicht nur die variable

Ich glaub du solltest mal etwas in der Referenz lesen was den Scope der Deklaration angeht ;)
 
Ich kenne die referenz ganz gut und dort steht genau das was ich dir gerade erzählt habe. Du musst die zugriffsfunktionen statisch machen weil sonst kein zugriff ohne instanz möglich ist (sofern das statische member private ist, wäre es das jedoch nicht wäre die klasse sinnlos).

Wie willst du getInstanz den ohne Objekt aufrufen?

PHP: Static Keyword - Manual

:roll:
 
Zitiert von morl:
PHP:
class DB {
     static private $instance = null;

     private function __construct() {
          /*
Hier müssen dann die Verbindungsdaten geholt werden (z.Bsp. aus einer Konfigurationsdate).
Ausserdem muss hier die Verbindung zur Datenbank hergestellt werden.
Die DB -Klasse sollte also Funktionen zur Verbindungsherstellung erhalten.
          */
     }

     public function getInstance() {
          if (self :: $instance == null) {
               self :: $instance = new DB();
          }
          return self :: $instance;
     }
}

Tut mir leid aber das geht nicht weil getInstance nicht statisch ist...
 
Das ist unlogisch. Das darf gar nicht funktionieren... Aus oben genannten gründen...
 
Seit wann können nur statische Methoden ausserhalb der Klasse aufgerufen werden? Das wäre unlogisch...

Skizzieren wir mal ein kleines Beispiel:
PHP:
class A {
     public function test() {
          return 'test';
     }
}

echo A :: test();
...sollte folgende Ausgabe erzeugen:
Code:
test


Genauso funktioniert das bei der Datenbankklasse auch:
PHP:
class DB {
     private static $instance = null;
     private $link;

     private function __construct() {
          $this->link = mysql_connect(...);
          mysql_select_db(...);
          ...
     }

     public function getInstance() {
          if (self :: $instance == null) {
               self :: $instance = new DB();
          }
          return self :: $instance;
     }

     public function test() {
          return 'test';
     }
}

$DB_instance = DB :: getInstance();
echo $DB_instance->test();
Ausgabe:
Code:
test

Wenn du es jetzt immer noch nicht glauben solltest...kopieren, einfügen und ausprobieren.
 
Ja, ich bezweifele ja auch nicht das es funktioniert mich wundert nur warum es funktioniert.

Denn wenn eine methode nicht statisch ist bedeutet das das sie in bezug zu einem konkreten Objekt steht und damit nicht ohne dieses aufgerufen werden kann. Klar bei deinen beispielen wird schnell ersichtlich das die methoden keinen wirklichen bezug zum einzelnen objekt besitzten, aber dadurch das du sie nicht statisch machst sollte der interpreter davon ausgehen das sie einen bezug haben und deswegen einen solchen aufruf verweigern bzw. mit einem fehler quitieren. Der interpreter kann das ja schließlich nicht beurteilen und darf es auch gar nicht beurteilen. Daher ist dieses verhalten für mich vollkommen unverständlich.

Ich drücke mich in bezug auf meine letzten posts dann mal so aus:
Es wäre korrekt (wenn auch nicht erforderlich) wenn du die methoden wir den zugriff ebenfalls als statisch markierst.

EDIT: Dein zweites beispiel verwendet eine instanz. Ich glaube du wolltest die methode test nicht über das objekt aufrufen oder?
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben