適配器模式將截然不同的函式介面封裝為統一 API。適用場景:MySQL、MySQLi、PDO 三種資料庫操作介面統一;快取介面統一。
namespace Baobab;
interface IDatabase {
function connect($host, $user, $passwd, $dbname);
function query($sql);
function fetch_result($result);
function close();
}
namespace Baobab\Database;
use Baobab\IDatabase;
class Mysqli implements IDatabase {
protected $conn;
function connect($host, $user, $passwd, $dbname) {
$this->conn = mysqli_connect($host, $user, $passwd, $dbname);
mysqli_set_charset($this->conn, 'utf8');
}
function query($sql) { return mysqli_query($this->conn, $sql); }
function fetch_result($result) { return mysqli_fetch_all($result); }
function close() { mysqli_close($this->conn); }
}
namespace Baobab\Database;
use Baobab\IDatabase;
class Pdo implements IDatabase {
protected $conn;
function connect($host, $user, $passwd, $dbname) {
$this->conn = new \PDO("mysql:dbname=$dbname;host=$host", $user, $passwd);
}
function query($sql) { return $this->conn->query($sql); }
function fetch_result($result) { return $result->fetchAll(); }
function close() { unset($this->conn); }
}
$db = new Baobab\Database\Mysqli();
$db->connect('127.0.0.1', 'root', '', 'test');
$res = $db->query('select * from ha_cl');
print_r($db->fetch_result($res));
$db->close();
客戶端程式碼不變,更換資料庫驅動只需替換適配器實例,符合開放封閉原則。