и конструктор (листинг 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 специальные "классы-фабрики", занимающиеся исключительно созданием объектов, как это принято в ООП…