Ben tek bir bağlantı dahil olduğunda (bu genellikle üzerinde çalışmak web uygulamaları için böyledir) benim veritabanı erişimi basitleştirmek için üç seçenek sunuyoruz Aşağıda.
Genel bir fikir benim komut bir sorgu yürütür ve komut sonlanana kadar o bağlı kalır ilk defa bağlar şekilde, DB bağlantı saydam hale getirmektir.
Ben neden iyi ve olduğunu düşünüyorum hangisini bilmek istiyorum. Ben bu onları kullanarak için çok üzgünüm uygun olabilecek tasarım desen isimlerini bilmiyorum. Ve PHP5 ile bunu yaparken herhangi bir better yolu varsa, lütfen paylaşın.
Kısa bir giriş vermek: Bir sorgu yöntemini içeren bir DB_Connection sınıf var. Bu kimin arayüz Bu örneğin amacıyla basitleştirilmiş ettik benim kontrolüm ve dışında bir üçüncü taraf sınıftır. Her seçeneğin ben de bazı bağlam vermek için bir hayali DB "ürün" tablosu için örnek bir model sağladık.
Seçenek 3 Benim en çok sevdiğim arayüzü ile bana sağlayan biridir, ama ne yazık ki pratik sanmıyorum.
Ben aşağıda açıklama bloklarında her artılarını ve (görebildiğim) eksileri tarif ettik.
Yükü benim DB sarıcı sınıf yerine modellerinde koymak olduğundan şu anda ben Seçenek 1 meyledeceğini.
Tüm yorumlar takdir!
Not: Nedense yığın taşması yerine önizleme çizgi bir kodlanmış HTML varlık gösteriyor. Sonrası böyle yoluyla gelirse, bunu dikkate lütfen.
<?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);
}
}
}