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

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


Краткое введение в типовые проекты 61

Чтобы избежать необходимости постоянно указывать параметры соединения, можно расширить класс DB_Mysql и жестко запрограммировать в подклассе параметры подключения к базе данных test:

class DB_Mysql_Test extends DB_Mysql { protected $user = "testuser"; protected $pass = "testpass"; protected $dbhost = "localhost"; protected $dbname = "test";

public function _construct() { }

Аналогично можно поступить для реального экземпляра:

class DB_Mysql_Prod extends DB_Mysql { protected $user = "produser"; protected $pass = "prodpass"; protected $dbhost = "prod.db.example.com"; protected $dbname = "prod";

public function _construct() { }

Полиморфизм

Классы-оболочки баз данных, разработанные в этой главе, являются в значительной степени общими. Фактически, если рассматривать другие расширения для доступа к базам данных, реализованные на РНР, можно отметить одинаковую базовую функциональность — подключение к базе данных, подготовка запросов, выполнение запросов и возвращение результатов. Если бы возникла необходимость, то можно было бы написать подобный класс DB_Pgsql или DB_Oracle, который упаковывает библиотеки PostgreSQL или Oracle, и сохранить в нем те же методы.

Несмотря на то что одинаковые методы не несут преимуществ, наличие идентично названных методов для осуществления одинаковых задач является важным. Это дает возможность полиморфизма, то есть возможность прозрачно заменять один объект другим, если их API-интерфейсы доступа одинаковы.

На практике полиморфизм означает, что можно написать подобную функцию:

function show entry($entry id, $dbh) {

$query = "SELECT * FROM Entries WHERE entry_id = :1"; $stmt = $dbh->prepare($query)->execute ($entry_id); $entry = $stmt->fetch_row(); // отображение записи

}

Эта функция работает не только в тех случаях, когда $dbh представляет собой объект класса DB_Mysql, она хорошо работает всегда при условии, что в объекте $dbh реализован метод prepare (), который возвращает объект, имеющий методы execute() и fetch_assoc ().

Для того чтобы избежать передачи объекта базы данных в каждую вызываемую функцию, можно использовать концепцию делегирования. Делегирование (delegation) — передача объекту в качестве атрибута другого объекта. Переданный объект используется принимающим объектом для выполнения определенных задач.




  Hostland.Ru

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