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

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


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

i

Естественно, можно также использовать вместо этого проект Tempalte для делегирования функций баз данных:

class Weblog_Std extends Weblog { protected $dbh; public function construct О {

$this->dbh = new Mysql Weblog;

)'

$blog = new Weblog_Std;

Делегирование полезно, когда необходимо представить сложную службу или службу, которая изменяется внутри класса. Другое распространенное применение делегирования — классы, которые должны генерировать вывод. Вывод может отображаться по-разному: как HTML, как RSS (что означает Rich Site Summary или Really Simple Syndication — формат для обмена заголовками новостей и статей) или как простой текст. В таком случае, возможно, есть смысл зарегистрировать делегата, способного генерировать необходимый вид вывода.

Интерфейсы и контроль типов

Ключом к успешному делегированию является гарантия того, что все классы, которым могут передаваться задачи, являются полиморфными. Если установить в качестве параметра $dbh для объекта класса Weblog какой-либо класс, в котором метод f etch_row () не реализован, то во время выполнения будет сгенерирована неисправимая ошибка. Если не проверять вручную, реализуют ли все объекты необходимые \ функции, обнаружение ошибок времени выполнения может оказаться достаточно сложной задачей.

Чтобы на ранней стадии облегчить обнаружение ошибок такого рода, в РНР 5 вводится понятие интерфейсов. Интерфейс (interface) подобен скелету для класса. Он определяет любое количество методов, но не предоставляет кода для них — только прототипы, такие как аргументы функций. Ниже приводится основной интерфейс, определяющий методы, необходимые для подключения к базе данных.

interface DB_Connection {

public function execute($query); public function prepare($query);

Поскольку класс наследуется путем расширения и так как в интерфейсе код не определен, пользователь просто соглашается реализовать функции согласно их определениям в интерфейсе.

Например, класс DB_Mysql реализует все прототипы функций, определенные в интерфейсе DB_Connection, поэтому можно было бы объявить данный класс следующим образом:

class DB_Mysql implements DB_Connection { /* определние класса */

}



  • Срочная широкоформатная печать.

  Hostland.Ru

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