Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 [ 152 ] 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189

$Obj2=new MysqlTable;

echo $Obj1->TableName, " ", $Obj2->TableName;

Здесь никаких проблем не возникает - ясно, что выводятся свойства разных объектов - мы же сами указали их до стрелки. Однако давайте посмотрим, что будет, если вызвать какой-нибудь метод одного из объектов:

$Obj1->Drop();

Как видите, при вызове метода так же, как и при доступе к свойству, нужно указать объект, который должен "откликнуться на запрос". Действительно, этой командой мы удаляем из базы данных таблицу $Obj1, а не $Obj2. Рассмотрим теперь тело метода

Drop() :

class MysqlTable { function Drop()

{ сюда интерпретатор попадет, когда вызовется Drop() для какого-то объекта

По логике, Drop() - функция. Эта функция, конечно, едина для всех объектов класса MysqlTable. Но как же метод Drop() узнает, для какого объекта он был вызван? Ведь мы не можем Drop() для $Obj1 сделать одним, а для $Obj2 - другим, иначе нарушился бы весь смысл нашей объектной ориентированности. В том-то вся и соль, что два различных объекта-таблицы являются объектами одного и того же класса...

Оказывается, для доступа к свойствам (и методам, т. к. один метод вполне может вызывать другой) внутри метода используется специальная предопределенная переменная $this, содержащая тот объект, для которого был вызван метод. Теперь мы можем определить Drop() внутри класса так:

function Drop()

{ сначала удаляем все записи из таблицы $this->Delete("1=1"); всегда истинное выражение а затем удаляем саму таблицу mysql query("drop table ".$this->TableName);

Если мы вызвали Drop() как $Obj1->Drop(), то $this будет являться тем же объектом, что и $Obj1 (это будет ссылка на $Obj1), а если бы мы вызвали $Obj2->Drop(), то $this был бы равен $Obj2. То есть метод всегда знает, для какого объекта он бгл вызван. Это настолько важно, что я повторю еще раз: метод всегда знает, для какого объекта он бт вызван.

Использование ссылок говорит о том, что $this - не просто копия объекта-хозяина, это и есть хозяин. Например, если бы в $Obj1->Drop() мы захотели изменить ка-



Не забудьте про & сразу после оператора присваивания (то есть создавайте ссылку на элемент массива), иначе метод DoIt() будет вызван не для самого объекта, присутствующего в массиве, а для его копии, полученной в $obj!

Инициализация объекта. Конструкторы

До сих пор мы не особенно задумывались, каким образом были созданы объекты $Obj1 и $Obj2 и к какой таблице они прикреплены. Однако вполне очевидно, что эти объекты не должны существовать сами по себе - это просто не имеет смысла. Поэтому нам, наравне с уже описанными методами, придется написать еще один - а именно, метод, который бы:

□ "привязывал" только что созданный объект-таблицу к таблице в MySQL;

□ сбрасывал индикатор ошибок;

□ заполнял свойство Fields;

□ делал другую работу по инициализации объекта. Назовем это метод, например, Init() :

class MysqlTable {

Привяз1вает объект-таблицу к таблице с именем $TblName

function Init($TblName)

{ $this->TableName=$TblName;

$this->Error=0;

получаем и заполняем $this->Fields

$Obj=new MysqlTable; $Obj->Init("test");

кое-то свойство $this, оно поменялось бы и у $Obj1, но не у $Obj2 или других объектов.

В синтаксисе PHP есть один просчет: запись вида

$ArrayOfObjects["obj"]->DoIt();

считается синтаксически некорректной. Вместо нее применяйте следующие две команды:

$obj=&$ArrayOfObjects["obj"]; $obj->DoIt();



Деструктор

По аналогии с конструкторами обгчно рассматриваются деструкторы. Деструктор - тоже специальный метод объекта, который вызывается при уничтожении этого объекта (например, после завершения программы). Деструкторы обычно выполняют служебную работу - закрывают файлы, записывают протоколы работы, разрывают соединения, "форматируют винчестер" - в общем, освобождают ресурсы. К сожалению, из-за "щедрости" PHP на выделение памяти, которая никогда не будет освобождена, деструкторы в нем не поддерживаются. Так что, если вам нужно выполнить нечто необычное после того, как вы перестали использовать какой-то объект, определите в нем метод, который будет это делать, и вызовите его явно.

Наследование

Создание самодостаточных объектов - довольно неплохая идея. Однако это далеко не единственная возможность ООП. Сейчас мы займемся наследованием - одним из основных понятий ООП.

Итак, пусть у нас есть некоторый класс A с определенными свойствами и методами. Но то, что этот класс делает, нас не совсем устраивает - например, пусть он выполняет большинство функций, по сути нам необходимых, но не реализует некоторых других. Зададимся целью создать новый класс B, как бы "расширяющий" возможно-

А вдруг между вызовами new и Init() случайно произойдет обращение к таблице? Или кто-то по ошибке забудет вызвать Init() для созданного объекта (что обязательно случится, дайте только время)? Это приведет к непредсказуемым последствиям. Поэтому, как и положено в ООП, мы можем завести метод вместо Init() , который будет вызываться автоматически сразу же после инструкции new и проводить работы по инициализации объекта. Он называется конструктором, или инициализатором. Чтобы PHP мог понять, что конструктор следует вызывать автоматически, ему (конструктору) нужно дать то же имя, что и имя класса. В нашем примере это будет выглядеть так:

class MysqlTable { function MysqlTable($TblName) { команды, ранее описанные в Init(); }

$Obj=new MysqlTable("test"); создаем и сразу же инициализируем объект

Обратите внимание на синтаксис передачи параметров конструктору. Если бы мы случайно пропустили параметр test, PHP выдал бы сообщение об ошибке. Таким образом, теперь в программе потенциально не могут быть созданы объекты-таблицы, ни к чему не привязанные.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 [ 152 ] 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189