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

Класс таблицы MySQL


Пожалуй, я слишком далеко заглянул в будущее. Вернемся назад к основам. Чтобы определить метод внутри класса, используется следующий синтаксис:

сlass MyClass {

 . . .

 function Method(параметры)

 { . . .

 }

 . . .

}

Давайте будем потихоньку набрасывать план нашего класса MySQL-таблицы. Во первых, зададимся вопросом: зачем нам вообще это нужно? Почему бы не пользоваться обычными функциями для работы с MySQL? Ответ не вполне очевиден, поэтому оставим его на потом. А пока будем считать, что такой класс нам необходим (а он действительно необходим, т. к.

значительно упрощает работу с базой данных).

Во-вторых, сформулируем правило: обращаться к какой-то таблице MySQL только посредством нашего класса, а точнее, объекта этого класса, связанного с таблицей. Как же его связать? Очевидно, объект должен содержать имя таблицы, к которой он "привязан". Так как в программе могут использоваться одновременно несколько таблиц и несколько объектов, то, наверное, логично это самое имя хранить в виде свойства.

Что бы еще хотелось знать об объекте-таблице? Конечно, имена и типы ее полей. Поместим их в свойство-массив. Наконец, в процессе работы наверняка иногда будут возникать ошибки. Чтобы как-то сигнализировать о них, предлагаю в класс-таблицу ввести еще одно свойство — Error. Оно будет равно нулю, если предыдущая операция (например, добавление записи) прошла успешно, и тексту ошибки — в противном случае.

Вот что у нас пока получилось:



class MysqlTable {

 var $TableName; // Имя таблицы в базе данных

 var $Fields; // Массив полей. Ключ — имя поля, значение — его тип

 var $Error; // Индикатор ошибки

 . . .

}

Согласитесь, это почти все данные, которые должны храниться в объекте-таблице. Все остальное (например, записи) находится в базе данных. Нам нужно научиться каким-то образом легко извлекать и добавлять (а также удалять, подсчитывать и обновлять) эти записи путем простых запросов к объекту-таблице. Для этого я предлагаю написать соответствующие методы (листинг 31.1).




Пока мы не будем расписывать код методов. Взамен просто обозначим его словом "команды" в тексте программы. Вообще говоря, такой способ проектирования, когда сначала решают, какие методы нам нужны, а потом начинают продумывать их код, довольно типичен для ООП.

Листинг 31.1. Эскиз класса таблицы

class MysqlTable {

 var $TableName; // Имя таблицы в базе данных

 var $Fields; // Массив полей. Ключ — имя поля, значение — его тип

 var $Error; // Индикатор ошибки

 // Добавляет в таблицу запись $Rec. $Rec должна представлять из себя

 // обычный ассоциативный массив. В будущем мы придем к тому, что

 // массив $Rec будет представлен даже древовидной структурой,

 // т. е. будет иметь подмассивы.

 // Как вы понимаете, непосредственной поддержки этого в MySQL нет,

 // но мы "ее" реализуем.

 function Add($Rec) { команды; }

 // Возвращает массив записей (ключ — id записи, значение —

 // ассоциативный массив, в точности такой же, какой был помещен

 // некогда в таблицу при помощи Add), удовлетворяющих выражению

 // $Expr. Возвращаются только первые $Num (или менее) записей.

 // Сортировка осуществляется в соответствии с критерием $Order.

 function Select($Expr,$Num=1e10,$Order="id desc") { команды; }

 // Удаляет из таблицы все записи, удовлетворяющие выражению $Expr.

 function Delete($Expr) { команды; }

 // Удаляет из таблицы все записи (например, при помощи вызова

 // Delete("1=1") и удаляет саму таблицу из базы данных. Этот

 // метод довольно опасен!

 function Drop() { команды; }

}

Пока, пожалуй, хватит. Я не буду здесь углубляться в то, как устроен каждый из названных методов. Этим мы займемся в свое время. А пока обратите внимание на то, что мы попытались определить все операции, которые вообще применимы к таблице MySQL (на самом деле, это далеко не полный их перечень, но пока нам и такого количества вполне достаточно). Это очень важно, потому что потом, когда будем использовать объекты класса MysqlTable, мы сможем вообще забыть, что такое MySQL и язык запросов SQL, или поручить разработку программы, обращающейся к MysqlTable, человеку, не разбирающемуся в SQL.

Вообще говоря, это один из самых главных приемов ООП (структурного программирования — в меньшей степени) — постоянно размышлять, как бы нам сделать так, чтобы потом можно было побольше "забыть". Работает принцип: если вы используете какой-то класс и не догадываетесь, как он реализован, причем это вам нисколько не мешает, значит, класс хорош.

И наоборот. Впрочем, совсем абстрагироваться от SQL нам все же не удастся — все-таки нужно знать правила составления выражений для выборки и удаления записей, для их сортировки и т. д. Но это уже не SQL, а что-то гораздо более простое и интуитивно понятное.


Содержание раздела