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

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


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

 Данные строк хранятся в массиве DB_Result: : result. Однако в желаемом API ссылка на данные задается как $obj - >column, а не как $obj->result [1 column1 ], поэтому еще остается выполнить эту работу.

Трудная часть в использовании ОО-интерфейса к результирующим множествам заключается в предоставлении доступа к именам столбцов как к свойствам. Очевидно, что, поскольку во время написания класса DB_Result невозможно знать имена столбцов запроса, корректно объявить столбцы раньше времени не удастся. Более того, так как класс DB_Result хранит все полученные строки, для этого ему требуется массив (в данном случае DB_Result: : result).

К счастью, РНР предоставляет возможность переопределить функции доступа к свойствам посредством двух специальных методов:

 function _get ($varname) {} —метод вызывается при попытке прочитать

значение неопределенного свойства;

 function _set ($varname, $value) {}—метод вызывается при попытке

записи значения неопределенного свойства.

В данном случае класс DB_Result должен "знать", что при доступе к имени столбца результирующего множества необходимо вернуть значение этого столбца в текущей строке результата. Реализовать это можно с помощью функции_get. В качестве

значения передаваемого ей параметра система задает имя необходимого свойства:

public function _get($varname)

{

if(array_key_exists($value,

$this->result[$this->currlndex])) { return $this->result[$this->currlndex][$value];

Здесь проверяется, существует ли переданный аргумент в результирующем множестве. Если это так, то функция доступа ищет значение для указанного имени столбца внутри $this->result.

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

Существует много других удачных применений переопределению атрибутов. Один

из интересных приемов заключается в использовании методов_get () и_set ()

для создания постоянного ассоциативного массива, который связан с DBM-файлом или другим постоянным хранилищем данных. Тем, кто знаком с Perl, это напомнит использование функции tie ().

Для создания постоянного хеша создается класс Tied, который хранит открытый дескриптор DBM-файла. (Подробно DBM-файлы рассматриваются в главе 10.) Когда инициируется запрос на чтение свойства, его значение извлекается из хеша и десериа-лизуется (что позволяет хранить сложные типы данных). Аналогично операция записи сериализует значение, которое присваивается переменной, и записывает его в DBM-файл. Ниже приводится пример, который связывает DBM-файл с ассоциативным массивом, фактически делая его постоянным массивом (это аналогично Tied-хешу в Perl).




  Hostland.Ru

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