echo $begrüßung;
» $mysqli = $this->_getConnection(); // das ist eine private Methode, die mit ein mysqli-Objekt mit aktiver Verbindung gibt.
_getConnection(), was ist das? meine getInstance()?
Das ist meine Version eines lazy connect.
Bzw. in meiner db-Klasse wird die Mysql-Verbindung ja in private static $_db_connection abgelegt und da die Methode query() ja in dieser Klasse liegt, einfach $mysqli = self::$_db_connection?
Da du ja die Connection schon hast, kannst du dir obige Zeile sparen und in der nächsten das $mysqli durch self::$_db_connection ersetzen.
Argh - jetzt bin ich wieder völlig überfordert und weiß nicht mal ob ich mich in einer YAGNI-Welt befinde, denn die ganze Zeit sitze ich daran eine db-Klasse auf Singleton-Pattern aufzubauen und nun sind alle Methoden static und ich kann jederzeit auf sie zugreifen auch ohne die Instanz.
Auch gut, dann weg mit der öffentlichen Instanz. Wenn du nach außen hin nur noch statische Methoden übrig hast, dann kann das Singleton weg. Oder besser: bau es zu einem lazy connect um. Du hast ja jetzt nur noch öffentliche Methoden à la db::query(...) und keinen mehr, der die Verbindung aufbaut. Dann brauchst du doch eine private und statische _getConnection(), die quasi als internes Singleton die Connection erstellt oder die erstellte bereitstellt.
Ich poste mal meine Aktuelle db-Klasse um sie Deiner/Eurer Bewertung unterziehen zu lassen:
Du wirst sie ja vermutlich gleich noch mal umarbeiten ... :-) Deswegen kommentiere ich nicht alles.
Singleton Pattern
public static function getInstance()
{
if (!isset(self::$_instance)) {
self::$_instance = new db();
} else {
die("Es ist bereits eine Instanz vorhanden - schliessen Sie diese um eine weitere zu erstellen.<br/>
Singleton-Pattern-Error.");
}
return self::$_instance;
}
Unabhängig von den Umbauplänen: Die Meldung ist für ein Singleton nicht sehr sinnig. Der else-Zweig sollte ganz weg, denn wenn die Instanz schon da ist, soll sie einfach rausgegeben werden.
3 Typen:
Typ 1: foo,bar
Typ 2: 'foo','bar'
Typ 3: foo='bar',foo='bar',
Typ 4: ?,?,? - MySQLi Platzhalter für prepared Statements
if($rwu==1||$rwu==2){ // Typ 1 oder 2
} elseif($rwu==3) { // Typ 3
} elseif($rwu==4) { // Typ 4
Es gibt Klassenkonstanten. Nutze diese statt nichtssagender Zahlen und dein Quelltext wird ein Stück lesbarer.
$whatkind -> Was für ein RUDI Query ist es? (SELECT(3), UPDATE(2), DELETE(4), INSERT(1))
Auch dafür bieten sich Klassenkonstanten mit sprechenden Namen an. (Übrigens: Die Bezeichnung RUDI gefällt mir am besten, üblicher aber sprachlich unschön ist CRUD (Create statt Insert). Nur damit du es mal gehört hast.)
Weitere Fragen in meinem Kopf sind ausserdem immernoch:
- Sollte der "Connect" im Konstruktor stattfinden oder nicht?
Mit dem Umstieg auf nur noch öffentliche statische Methoden brauchst du eigentlich nur noch ein mysqli-Objekt, das du dir in einer privaten statischen Klassenvariable merken kannst. Einen Konstruktor brauchst du nicht. Du kannst ihn private und leer lassen, damit keine Instanz erstellt werden kann, aber selbst wenn: solange es nur statisches Zeug gibt, nützt eine Instanz nichts, denn sie hat keine Methoden und keine Eigenschaften, die man aufrufen könnte.
- Wie könnte der Destruktor aussehen?
Keine Instanz - kein Destruktor.
echo "$verabschiedung $name";