OOP - MySQL Klasse sinnvoll? -> Verwendung in anderer Klasse?

Ok, bevor ich soweit denke und versuche auch einen möglichs abstrakten Namen für meinen Singletone zu finden, injiziere ich lieber...
 
Auf Einmaligkeit kann ich die natürlich nicht überprüfen, wenn es das ist was du meinst. Her kommen die aus einem "new Klasse" ...
 
Nein, ich erstelle es eifnach nur einmal und kann es dann beliebig oft injizieren. Solche Objekte werden bei mir an zentraler Stelle gebaut und weitergereicht.
 
Hmm, also doch sowas wie ein Singleton? Geb doch mal bitte ein einfaches praxis-orientiertes Beispiel. Ich bin immer an neuen Dingen interessiert.
 
Es gibt keine praxisorientierten beispiele bei mir ;) Das ist nur in meinem Kopf... Wenn ich programmiere dann mit framework und die haben das schon "irgendwie" implementiert.

Aber was ich spannend finde: Für beides lassen sich Vor- und Nachteile finden, aber was sollte man benutzen:

Singletone:
- Es kann nur eine Instanz geben
- Das Singletone ist nicht austauschbar (Programmierung gegen Implementierung statt gegen Schnittstelle)
- Verletzung eines OOP-Dogmas: Kapselung von Daten (Ist global ansprechbar/ aus jedem Kontext heraus)

DI:
- Abhängigkeiten werden injiziert/sind wie beim Singletone also verfügbar, allerdings nur bei bedarf, nicht global
- Es kann beliebig viele Instanzen geben
- Folgt den Regeln der OOP
 
Ist es von der Logik her nicht am einfachsten das Datenbank Objekt an die anderen Klassen zu übergeben.
Mit PDO kann man ja eigentlich alle Datenbanken ansprechen.

In etwa so...
PHP:
class DB extends PDO
{
      private $_instance = NULL;

     private function __construct($dns, $user, $pass)
      {
            parent::__construct( $dns, $user, $pass ); 
      }

      public function getInstance()
      {
            if(is_null($this->_instance))
            {
                  $this->_instance = new self();
            }

            return $this->_instance;
      }

      public function query($sql)
      {
            // Query stuff here
      }
}

$db = DB->getInstance();
$someClass = new SomethingClass($db);


class SomethingClass
{
      private $_db = NULL;

      public function __construct(PDO $db)
      {
            $this->_db = $db;
      }

      public function irgendwas_aus_der_datenbank_lesen($sql)
      {
            $this->_db->query($sql);
      }
}

Bin mir nicht ganz sicher ob das 100% funktioniert aber von der Grundidee her kann man
eine Datenbank Klasse als Singleton bauen und einfach nur das Objekt an die anderen
Klassen übergeben.
In der "DB" Klasse lässt sich über den "$dns" auch die Art der Datenbank ändern.

Code:
mysql:dbname=testdb;host=127.0.0.1
Code:
mysql:dbname=testdb;host=127.0.0.1
usw....

So bricht man auch nicht mit OOP...
 
mit framework und die haben das schon "irgendwie" implementiert.

Mag sein, mag sein. Theorie und Praxis her... Mich interessiert aber schon, was im Unterbau passiert. Und wenn das irgendwie inperformant ist, bin ich da eher pragmatisch denn dogmatisch veranlagt.

Wenn ich mit new Klasse ein neues Objekt erzeuge, habe ich auch den Code ausgeführt, der im Konstruktor der Klasse steht. Wenn der Code eine neue Datenbankverbindung (wie auch immer z.b. durch mysql_connect() oder auch new PDO()) aufbaut, dann ist das so und nicht unbedingt in meinem Sinne, denn:

- Jede neue Verbindung zu einer Resource kostet (im Falle einer Datenbankverbindung sogar relativ viel).
- Jede neue Verbindung nimmt einer anderen Sitzung Resourcen weg.

Wenn ich dann das Neuerstellen der Verbindung irgendwie in eine einmalige Angelegenheit umwandeln kann, werde ich den Weg gehen, vor allem dann, wenn die Neuerstellung jedes Mal 100ms oder mehr kostet (bei 10x new Klasse() sind das schon eine Sekunde) ;-)

PHP:
     private function __construct($dns, $user, $pass)
      {
            parent::__construct( $dns, $user, $pass ); 
      }

Bin mir nicht ganz sicher ob das 100% funktioniert

Hatten wir schon, nein, funktioniert nicht ;-) PDO hat einen public Konstruktor, da darf man in der Ableitung keinen privaten draus machen. Siehe auch Post #8

Aber sonst gebe ich dir Recht: Das Abholen der Datenbankverbindung aus dem Singleton kann auch prima an die DependencyInjection übergeben werden.

Ich sehe da keinen Verstoß gegen OOP, ob man jetzt "new Klasse" notiert oder "Klasse::getInstance()" macht aus OOP-Logik her keinen Unterschied, genauso wenig wie "Klasse::factory()".

Siehst du das anders alxy?
 
Der Verstoß gegen die OOp-Regeln liegt mMn in den Zugriffsmöglichkeiten auf das Singletone. Alle öffentlichen Methoden sind nunmal global ansprechbar (! = kapselung von Daten)
 
Zurück