Hallo,
[...] Prinzipiell könnte das von außen so aussehen.
class DB {
private static $db;
public static function Init($config_values) { ... }
public static function Query($sql, $values = null) { ... }
public static function Quote($value) { ... }
}
ist nicht bereits die MySQLi-Klasse im Stande selbstständig die Verbindungen zu verwalten. So habe ich wirklich nur das Gefühl, als würde ich einen Wrapper schreiben. Auch ist mir unklar, warum es in diesem Fall statisch sein sollte, da es hier für mich durchaus Sinn machen würde, mehrere Objekte (mit unterschiedlichen Datenbankverbindungen) zu erzeugen.
Hier einfach mal die Klasse, die ich anhand deines Schemas geschrieben habe:
<?php
class DB
{
private $db;
public function __construct($host, $username, $passwd, $dbname, $port=3306)
{
$this->db=new mysqli($host, $username, $passwd, $dbname, $port);
}
public function query($sql, $resultmode)
{
$this->db->query($sql, $resultmode);
}
public function quote_identifier($value)
{
return '`'.str_replace('`', '``', &$value).'`';
}
public function quote_expression($value)
{
return $this->db->real_escape_string(&$value);
}
}
?>
In meinen Augen bietet diese Klasse die gleichen Möglichkeiten wie die MySQLi-Klasse (nur dass ich noch die quote_identifier-Methode hinzugefügt habe).
Wenn es nicht stört, dann lass es doch. Du als Autor bist nicht unbedingt schuld, wenn der Verwender es falsch einsetzt. Wenn er unbedingt will, lass ihn doch. Du hast nur mehr Aufwand auf deiner Seite. (Und dass du Autor und Verwender in Personalunion bist, ist auch nebensächlich.)
Habe ich mir jetzt auch gedacht, nur hätte ich es nie so schön formulieren können.
Schön gepackte Variablen bekommt man durch die OOP, da braucht es noch kein Singleton dazu. Schön gepackt bekommt man auch alles, wenn man funktional programmiert.
Und da weiß ich wieder nicht, wie ich es in PHP schaffen sollte, nur mithilfe von Funktionen die Variablen (MySQL-Verbindung, Konfigurationsarray, ...) nicht jedes Mal bei einem Funktionsaufruf neu erzeugen zu müssen. Da sehe ich keinen Weg, das ohne globale Variablen hinzubekommen.Das war ja nur mal so ein Beispiel. Aber wenn du dich erinnerst, erwähnte ich, dass man das Singleton-Pattern auch mit einer herkömmlichen Funktion implementieren kann, denn man kann darin statische Variablen anlegen.
Ahh! Jetzt verstehe ich, was du da meintest. Mir war nicht bewusst, dass ich auch in Funktionen statische Variablen anlegen kann. Daher hat dein Text für mich keinen Sinn ergeben. Ist das eigentlich in anderen Programmiersprachen (Java, C++) auch möglich?
Aber somit stimmt es, dass man ein Singleton auch ohne Klasse erstellen kann!
Alltagsweisheiten in Sprüche geklopft haben schon Generationen vor dir und mir: Meister fallen nicht vom Himmel. Erfahrungen sammelt man auch, wenn man erst mal den "falschen" Ansatz implementiert hat. Selbst wenn du dir noch so viel Mühe gibst und am Ende denkst, jetzt war es perfekt, kommst du ein paar Monde später wieder und findest mit inzwischen neu erworbenem Wissen und Erfahrungen, Dinge die verbesserungs- bis wegwerfwürdig sind.
Dieses Phänomen ist schon öfters bei meinen Skripten (JavaScript und PHP) aufgetreten, bei denen ich mir gedacht habe, dass ich das ab jetzt besser (-> perfekt) machen müsste.
Die gibts so wenig wie den Do-what-I-mean-Button für Anwender. Programmieren ist nicht selten wie das Rennen von einer Sackgasse in die nächste. Vielleicht fehlt dir beim Handwerklichen nur die nötige Übung. Programmieren benötigt sie auch, nur mehr auf mentaler Ebene.
Da hast du wohl Recht! Tätigkeiten, die ich früher nicht konnte, kann ich mittlerweile ganz passabel, da ich Übung darin gewonnen habe.
Mit der Zeit werden deine Antworten für mich leider immer unverständlicher. Allerdings freue ich mich, dass du mir trotzdem noch versuchst, alles zu erklären. Vermutlich fehlt mir einfach das nötige Vorwissen.
Scheu dich nicht nachzufragen, ich finde dann sicher eine noch unverständlichere Erklärung.
Das ist mal eine leicht verständliche und humorvolle Antwort. Damit ermunterst du mich gleich, dich immer weiter mit Fragen zu durchlöchern!
Ein schönes Wochenende
Rachus