САМОУЧИТЕЛЬ PHP 4



         

Возврат интерфейса - часть 3


и конструктор (листинг 31.5):

Листинг 31.5. Упрощенный интерфейс к таблице MySQL

// Массив объектов-таблиц, созданных в программе

$GLOBALS["Tables"]=array(); // вначале массив пуст

// Реализация класса. Это — обычный класс без каких-либо особенностей.

// Давайте предположим, что объекты этого класса недопустимо

// копировать обычным способом.

class MysqlTable {

 // . . .

 function MysqlTable($name) { echo "MysqlTable($name)<br>"; }

 function Drop() { echo "Drop()<br>"; }

}

// Класс-интерфейс

class IMysql {

 var $id; // идентификатор реализации таблицы (MysqlTable) в $Tables

 // Открывает таблицу с именем $name. Если эта таблица уже была

 // открыта ранее, то ничего не делает и просто становится ее

 // синонимом, иначе создает экземпляр объекта.

 function IMysql($name)

 { global $Tables;

 $this->id=$name;

 // Если объект для таблицы $name еще не создан, создать его

 if(!isset($Tables[$name])) $Tables[$name]=new MysqlTable($name);

 // Иначе объект уже существует и ничего делать не надо

 }

 // Уничтожает таблицу. Переадресуем вызов реализации

 function Drop() { $obj=&$GLOBALS['Tables'][$this->id]; $obj->Drop(); }

}

// Демонстрация работы с интерфейсом

$m=new IMysql("TestTable"); // объект создается

$m=new IMysql("TestTable"); // новый объект не создается!

$m->Drop(); // очищается единственный объект

Откровенно говоря, мы реализовали здесь не совсем то, что в объектно-ориентированном проектировании принято называть "интерфейсом". По определению интерфейс не может иметь конструктора, класс же IMysql его имеет. Так что слово "интерфейс" здесь, мягко говоря, не подходит, но я буду называть класс IMysql именно так — для краткости. Думаю, в этом нет ничего страш­ного — такова уж специфика PHP, и это самое простое, что можно было бы предложить. В самом деле, не писать же на PHP специальные "классы-фабрики", занимающиеся исключительно созданием объектов, как это принято в ООП…




Содержание  Назад  Вперед