Bambino
Новичок
Работа с БД, паттерн Фабрика или другой?
Хочу создать классы для работы с различными БД на основе PDO. Есть два варианта реализации, но не могу выбрать. Поможете?
вариант 1:
вариант 2:
-~{}~ 30.03.10 13:39:
Что правильнее и лучше, создать новый метод для нового драйвера БД или создать новый класс?
Хочу создать классы для работы с различными БД на основе PDO. Есть два варианта реализации, но не могу выбрать. Поможете?
вариант 1:
PHP:
class DbDriver extends PDO {
function __construct () {
$args = func_get_args ();
// здесь вызываем конструктор PDO с нужными параметрами
switch ( count ( $args ) ) {
case 2:
parent::__construct ( $args[0] . ':' . $args[1] );
case 4:
parent::__construct ( $args[0] . ':' . $args[1], $args[2], $args[3] );
}
}
function query () {
// выполняем запросы
}
static function CreateMySQLConnection ( $db, $username, $password ) {
return new self ( 'mysql', $db, $username, $password );
}
static function CreateSQLiteConnection ( $db ) {
return new self ( 'sqlite', $db );
}
}
$sqlite = DbDriver::CreateSQLiteConnection ( 'db' );
$sqlite->query ( 'SELECT...' );
PHP:
abstract class DbDriver extends PDO {
function __construct () {
$args = func_get_args ();
// здесь вызываем конструктор PDO с нужными параметрами
switch ( count ( $args ) ) {
case 2:
parent::__construct ( $args[0] . ':' . $args[1] );
case 4:
parent::__construct ( $args[0] . ':' . $args[1], $args[2], $args[3] );
}
}
}
class DbSQLite extends DbDriver {
function __construct ( $db ) {
parent::__construct ( 'sqlite:' . $db );
}
static function Create ( $db ) {
return new self ( $db );
}
}
class DbMySQL extends DbDriver {
function __construct ( $db, $username, $password ) {
parent::__construct ( 'mysql:' . $db, $username, $password );
}
static function Create ( $db, $username, $password ) {
return new self ( $db, $username, $password );
}
}
$sqlite = DbSQLite::Create ( $db );
$sqlite->query ( 'SELECT...' );
Что правильнее и лучше, создать новый метод для нового драйвера БД или создать новый класс?
Если имеется в виду некая рефлексия типа используемого драйвера PDO - то лучше делать разбор DSN типа mysql://user@pass/host/base (pgsql://, sqlite:// etc). А инстанс создавать фабрикой, которой DSN передавать параметром. Бонус - фабрика может кешировать инстансы по DSN (чтобы гарантировать один инстанс к одному DSN). Рекомендую посмотреть на DbSimple у Котерова на dklab.ru, там много полезного.