Профессиональное программирование на PHP

Страница 63 из 591


бб Глава 2 Объектно-ориентированное программирование...

function addDB (DB Connection $dbh) {

$this->dbh = $dbh;

}

Данная функция работает точно так же, как и функция в предыдущем примере, она генерирует неисправимую ошибку, если $dbh не является экземпляром класса DB_Con-nection (непосредственно либо через наследование или реализацию интерфейса).

Проект Factory

Проект Factory предоставляет классу стандартный способ создания объектов других классов. Обычно это используется, когда существует функция, которая в зависимости от входных параметров должна возвращать объекты различных классов.

Одна из главных сложностей при переносе служб на другую базу данных заключается в том, чтобы найти все места, где используется объект старой оболочки, и применить новую. Предположим, существует основанная на технологии Oracle база данных отчетов. Доступ к ней осуществляется исключительно посредством класса DB_Oracle_Repor-ting, а класс DB_Oracle, благодаря дальновидности программиста, использует разработанный выше стандартный API-интерфейс к базе данных.

class DB_Oracle_Reporting extends DB_Oracle { /* ... */} ''

class DB_Oracle implements DB_Connection {/*...*/}

Везде в коде приложения каждый раз, когда требуется доступ к базе данных отчетов, для создания объекта упаковщика используется следующая конструкция:

$dbh = new DB_Oracle_Reporting;

Если понадобится переключить базу данных на новый упаковщик DB_Mysql_Repo-rt ing, то придется во всем коде заменить старый упаковщик на новый:

$dbh = new DB_Mysql_Reporting;

Более гибкий подход заключается в том, чтобы создавать все объекты базы данных в одном блоке. Такой блок может выглядеть следующим образом:

function DB Connection Factory($key) {

switch($key) { case "Test":

return new DB_Mysql_Test; case "Prod":

return new DB_Mysql_Prod; case "Weblog":

return new DB_Pgsql_Weblog; case "Reporting":

return new DB_Oracle_Reporting; default:

return false;




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006