Lucien: PHP5, OOP: Singleton hier sinnvoll / Ausführung

Hallo Leute.

Ich schreibe gerade ein Wenig mit PHP5 rum und habe jetzt zwei Fragenbereiche:

Thema I:
Ich habe eine Klasse aus statischen Methoden und Eigenschaften (PHP5!), die mir bestimmte, im Progammablauf öfter benötigte, Objekte global zur Verfügung stellt und unter Anderem erst bei Bedarf instantiiert. Z.B. eine Datenbank Abstraktion (PEAR DB, ADOdb), einen Logger (PEAR Log) usw.
Ich bekomme also z.B. mit "$db = Devices::getDB();" das Datenbank-Objekt und bleibe somit immer bei einer Instanz.

1. Ist der Ansatz ganz allgemein sinnvoll (besonders das Festhalten der Instanzen in den statischen Eigenschaften)?
2. Da ich alles gerne sehr ordentlich benannt haben möchte schwanke ich zwischen zwei Arten die Instanzen abzurufen. Zum einen, für jedes Objekt eine eigene Methode (getDB(), getLog(), ...) oder eine Methode für alle (singleton('db'), singleton('log'), ...). Das erste sieht im Quelltext besser aus, das zweite legt den Sinn und Hintergrund des Aufrufs besser dar. Gibt es andere Gründe die für das Eine oder das Andere sprechen?

Thema II:
Wenn ich eine bestimmte Klasse in meinem Programm sowieso nur einmal instantiieren würde, macht es dann sinn alle Methoden und Eigenschaften statisch zu halten, einfach keine Instanz zu erstellen und mit den statischen Eigenschaften zu arbeiten (wie ich es im oberen Fall ja mache)?

Ich bedanke mich bei denen die sich Zeit nehmen diese Fragen zu klären. :-)
Grüsse, Lucien

  1. Hallo

    1. Ist der Ansatz ganz allgemein sinnvoll (besonders das Festhalten der Instanzen in den statischen Eigenschaften)?

    Ich denke der Ansatz ist sinnvoll, da man so auch in großen Projekten einfach seine Objekte instanzieren kann und sich sicher ist das ein und das selbe Objekt immer nur einmal Speicher belegt.

    1. Da ich alles gerne sehr ordentlich benannt haben möchte schwanke ich zwischen zwei Arten die Instanzen abzurufen. Zum einen, für jedes Objekt eine eigene Methode (getDB(), getLog(), ...) oder eine Methode für alle (singleton('db'), singleton('log'), ...). Das erste sieht im Quelltext besser aus, das zweite legt den Sinn und Hintergrund des Aufrufs besser dar. Gibt es andere Gründe die für das Eine oder das Andere sprechen?

    Bei mir haben die Klassen eine Methode instance() die liefert einfach die statische Instanz oder mach eine neue wenn noch keine vorhanden ist.

    Schöne Grüße
    Fichtl

    1. Ich denke der Ansatz ist sinnvoll, da man so auch in großen Projekten einfach seine Objekte instanzieren kann und sich sicher ist das ein und das selbe Objekt immer nur einmal Speicher belegt.

      Bei mir haben die Klassen eine Methode instance() die liefert einfach die statische Instanz oder mach eine neue wenn noch keine vorhanden ist.

      Hi Fichtl!

      Danke für deine Antwort. Das ganze Singleton-Konzept hat sich inzwischen als sehr praktisch erwiesen, was mich aber noch wurmt ist meine Idee die Instanzen mehrerer verschiedener Objekte in einer Klasse versammelt zu halten. Quasi der Ordnung halber.
      Alle Objekte, die Daten Laden bzw. speichern (Datenbank-Klasse, Logging-Klasse, ...) habe ich in einer Klasse "Devices" und bekomme die Instanzen mit "getDB(), getLog(), ...".

      1. Macht es Sinn auf diese Weise Ordnung zu schaffen? (PHP5 kennt ja keine Namespaces). Können damit Probleme auftreten die ich jetzt vielleicht noch nicht absehe? Ich möchte einfach, dass für später alles _möglichst_ gut durchdacht ist und wartbar bzw. erweiterbar ist.

      2. Statt für jedes Objekt eine eigene Methode zu haben ("getDB(), getLog(), usw.") könnte ich auch alles in eine zusammenfassen ("singleton('db'), singleton('log'), ..."). Damit würde ich sicher Quellcode sparen. Kann man dazu noch mehr sagen?

      Grüsse, Lucien

        1. Macht es Sinn auf diese Weise Ordnung zu schaffen? (PHP5 kennt ja keine Namespaces). Können damit Probleme auftreten die ich jetzt vielleicht noch nicht absehe? Ich möchte einfach, dass für später alles _möglichst_ gut durchdacht ist und wartbar bzw. erweiterbar ist.

        Wozu müssen die beiden Klassen in Devices sein? Was hat es für Vorteile ausser das es aufgeräumt ist? Ich würde das lassen und einfach da wo ich ein DB-Objekt brauche da hol ich mir es direkt:

        $db = MyDB::instance();

        Man spart sich dadurch eine Klasse. Beim Logging dasselbe, wobei ich denke das man doch meistens gar keine Instanz braucht sondern direkt die Funktion statisch aufruft.

        MyLogging::write('Loging Info');

        Natürlich kann es sein das deine Devices noch mehr machen, dann kann die Klasse nütrlich sinnvoll sein das weiß ich allerdings jetzt nicht. Übrigens scheint deine Devices-Klasse sowas wie eine "Object Factory" zu sein.

        1. Statt für jedes Objekt eine eigene Methode zu haben ("getDB(), getLog(), usw.") könnte ich auch alles in eine zusammenfassen ("singleton('db'), singleton('log'), ..."). Damit würde ich sicher Quellcode sparen. Kann man dazu noch mehr sagen?

        Google mal danach ('Object Factory Pattern'), das ist eine Klasse die Objekte anderer Klassen erzeugt. Vielleicht willst du ja sowas haben.

        Schöne Grüße