Im Folgenden stelle ich drei Optionen vor, um meinen Datenbankzugriff zu vereinfachen, wenn nur eine einzige Verbindung involviert ist (dies ist häufig der Fall für die Web-Apps, an denen ich arbeite).Beste Möglichkeit zum Ausblenden von DB-Verbindungscode in PHP5 für Apps, die nur eine Verbindung benötigen?
Die allgemeine Idee ist, die DB-Verbindung transparent zu machen, so dass es verbindet, wenn mein Skript zum ersten Mal eine Abfrage ausführt, und dann verbunden bleibt, bis das Skript beendet wird.
Ich würde gerne wissen, welche Sie denken, ist die beste und warum. Ich kenne die Namen von Designmustern, denen diese passen könnten, so sehr, dass ich sie nicht verwende. Und wenn es eine bessere Möglichkeit gibt, dies mit PHP5 zu tun, bitte teilen.
Um eine kurze Einführung zu geben: Es gibt eine DB_Connection-Klasse, die eine Abfrage-Methode enthält. Dies ist eine Drittanbieter-Klasse, die ich nicht kontrollieren kann und deren Schnittstelle ich für dieses Beispiel vereinfacht habe. In jeder Option habe ich auch ein Beispielmodell für eine imaginäre DB "items" -Tabelle bereitgestellt, um einen Kontext zu geben.
Option 3 ist diejenige, die mir die Schnittstelle bietet, die ich am meisten mag, aber ich denke nicht, dass es praktisch ist.
Ich habe die Vor- und Nachteile (die ich sehen kann) von jedem in den Kommentaren unten beschrieben.
Im Moment lehne ich mich Richtung Option 1, da die Last auf meine DB-Wrapper-Klasse statt auf die Modelle gelegt wird.
Alle Kommentare erwünscht!
Hinweis: Aus irgendeinem Grund zeigt die Stack Overflow-Vorschau eine codierte HTML-Entität anstelle von Unterstrichen. Wenn die Post so kommt, bitte beachten Sie dies.
<?php
/**
* This is the 3rd-party DB interface I'm trying to wrap.
* I've simplified the interface to one method for this example.
*
* This class is used in each option below.
*/
class DB_Connection {
public function &query($sql) { }
}
/**
* OPTION 1
*
* Cons: Have to wrap every public DB_Connection method.
* Pros: The model code is simple.
*/
class DB {
private static $connection;
private static function &getConnection() {
if (!self::$connection) {
self::$connection = new DB_Connection();
}
return self::$connection;
}
public static function &query($sql) {
$dbh = self::getConnection();
return $dbh->query($sql);
}
}
class Item {
public static function &getList() {
return DB::query("SELECT * FROM items");
}
}
/**
* OPTION 2
*
* Pros: Don't have to wrap every DB_Connection function like in Option 1
* Cons: Every function in the model is responsible for checking the connection
*/
class DB {
protected static $connection = null;
public function connect() {
self::$connection = new DB_Connection();
}
}
class Item extends DB {
public static function &getList() {
if (!self::$connection) $this->connect();
return self::$connection->query("SELECT * FROM items");
}
}
/**
* OPTION 3
*
* Use magic methods
*
* Pros: Simple model code AND don't have to reimplement the DB_Connection interface
* Cons: __callStatic requires PHP 5.3.0 and its args can't be passed-by-reference.
*/
class DB {
private static $connection = null;
public static function &getConnection() {
if (!self::$connection) {
self::$connection = new DB_Connection();
}
return self::$connection;
}
public static function __callStatic($name, $args) {
if (in_array($name, get_class_methods('DB_Connection'))) {
return call_user_func_array(
array(self::getConnection(), $name), $args);
}
}
}