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

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


Переопределение 69

Переопределение

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

В частности, может понадобиться возможность выполнить следующее:

$query = "SELECT name, email FROM users";

$dbh = new DB_Mysql_Test;

$stmt = $dbh->prepare($query)->execute();

$result = $stmt->fetch();

while($result->next()) {

print "<a href=\"mailto:$result->email\">$result->name</a>";

}

Логика кода обычна до выполнения запроса. Затем вместо последовательного возвращения строк в виде ассоциативных массивов более элегантным было бы вернуть результирующий объект с внутренним итератором, который захватывает все полученные строки.

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

Класс DB_Result должен обладать прямым и обратным итераторами, а также иметь возможность переустанавливать позицию в результирующем множестве. Подобная функциональность, несомненно, является следствием технических приемов, рассмотренных выше. Ниже представлена базовая реализация класса DB_Resul t:

class DB_Result { protected $stmt; protected $result = array(); private $rowIndex = 0; private $currIndex = 0; private $done = false;

public function construct(DB Statement $stmt)

{ ~~

$this->stmt = $stmt;

}

public function first() {

if(!$this->result) {

$this->result[$this->rowlndex++] = $this->stmt->fetch assocO;

}

$this->currlndex * 0; return $this;

}

public function last() {

if(!$this->done) {

array_push($this->result, $this->stmt->fetchall_assoc());




  Hostland.Ru

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