Я создаю приложение, которое я хочу запускать на MySQL или SQL Server (не одновременно). Я создал два класса PHP DatabaseMySQL и DatabaseSQLSVR, и я хотел бы, чтобы мое приложение узнало, какой класс базы данных для использования на основе постоянной настройки при установке.
define (DB_TYPE, "mysql" );//или "sqlsrv"
Я пытаюсь найти лучший способ справиться с этим. Моя мысль состоит в том, чтобы делать "if else" везде, где я создаю базу данных:
$db = (DB_TYPE == "mysql" )? новый DatabaseMySQL: новый DatabaseSQLSVR;
Я знаю, что должен быть лучший способ сделать это. Предположим, я хочу добавить третий тип базы данных позже; Мне нужно будет переделать весь код.
В простейших возможных терминах:
Используйте define для определения "DB_TYPE" как YourFullyQualifiedClassName, затем...
define('DB_TYPE', 'DatabaseMySQL') // or DatabaseSQLSVR or ...
$myDBType = DB_TYPE;
$db = new $myDBType();
Вы должны изучить использование такой технологии, как PEAR.
Вот хорошая статья о PEAR. http://www.evolt.org/node/21927
Проблема заключается в том, что существует некоторая нечетная бит синтаксиса, которую вы никогда не планировали, для которой по-разному используются разные драйверы - например, объяснять планы, транзакции...
Хорошей отправной точкой было бы использовать общий набор инструментов абстракции, такой как dbx, adodb или PDO.
В каждом случае драйвер СУБД можно ссылаться как элемент данных так же, как имя пользователя или пароль - никаких условных операторов.
С.
Я предлагаю вам создать два объекта доступа к данным, которые выполняют различные действия DB, необходимые вашему приложению. Используйте Factory Pattern, чтобы вернуть либо реализацию MySQL, либо MS SQL, и сделать весь доступ к данным на ваших страницах PHP, используя этот объект доступа к данным.
Таким образом, вы можете настроить поведение (как предлагает OMG Ponies) по мере необходимости для каждой целевой базы данных. Если вы используете общий базовый класс, вы можете наследовать одну и ту же реализацию для обеих баз данных и предоставлять только определенную реализацию, если это оправдано (хотя я еще не сделал много OO PHP... не уверен, поддерживается ли наследование?).
Обычный способ состоит в том, чтобы их оба вызывали одно и то же (скажем, базу данных) и каждый помещался в отдельный файл. Тогда вам понадобится:
define(DB_TYPE, "mysql"); // or "sqlsrv"
require('db/' . DB_TYPE . '.php');
и вы могли бы просто $db = new Database();
РЕДАКТИРОВАТЬ: Обратите внимание, что для вашей системы важно правильно работать с интерфейсом, который соответственно реализуется обоими классами.