Druzya.org
Возьмемся за руки, Друзья...
 
 
Наши Друзья

Александр Градский
Мемориальный сайт Дольфи. 
				  Светлой памяти детей,
				  погибших  1 июня 2001 года, 
				  а также всем жертвам теракта возле 
				 Тель-Авивского Дельфинариума посвящается...

Библиотека :: Компьютеры и Программирование :: Котеров Д. В. - Самоучитель PHP 4
<<-[Весь Текст]
Страница: из 287
 <<-
 
 Init() случайно произойдет обращение к таблице? 
Или кто-то по ошибке забудет вызвать Init() для созданного объекта (что обяза- 
тельно случится, дайте только время)? Это приведет к непредсказуемым 
последстви- 
ям. Поэтому, как и положено в ООП, мы можем завести метод вместо Init(), кото- 
рый будет вызываться автоматически сразу же после инструкции new и проводить 
работы по инициализации объекта. Он называется конструктором, или инициализа- 
тором. Чтобы PHP мог понять, что конструктор следует вызывать автоматически, 
ему 
(конструктору) нужно дать то же имя, что и имя класса. В нашем примере это 
будет 
выглядеть так: 
class MysqlTable { 
function MysqlTable($TblName) 
{ команды, ранее описанные в Init(); 
} 
} 
$Obj=new MysqlTable("test"); // создаем и сразу же инициализируем объект 
Обратите внимание на синтаксис передачи параметров конструктору. Если бы мы 
случайно пропустили параметр test, PHP выдал бы сообщение об ошибке. Таким 
образом, теперь в программе потенциально не могут быть созданы объекты-таблицы, 

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

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

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

Часть V. Приемы программирования на PHP 462 
сти класса A, добавляющий ему несколько новых свойств и методов. Сделать это 
можно двумя принципиально различными способами. Первый выглядит примерно 
так: 
class A { 
function TestA() { ... } 
function Test() { ... } 
} 
class B { 
var $a; // объект класса A 
function B(параметры_для_A, другие_параметры) 
{ $a=new A(параметры_для_A); 
инициализируем другие поля B 
} 
function TestB() { ... } 
function Test() { ... } 
} 
Поясню: в этой реализации объект класса B содержит в своем составе подобъект 
класса A в качестве свойства. Это свойство — лишь "частичка" объекта класса B, 
не 
более того. Подобъект не "знает", что он в действительности не самостоятелен, а 
со- 
держится в классе B, поэтому не может предпринимать никаких действий, специфич- 

ных для этого класса. 
Но вспомним, что мы хотели получить расширение возможностей класса A, а не не- 
что, содержащее объекты A. Что означает "расширение"? Лишь одно: мы бы хотели, 
чтобы везде, где допустима работа с объектами класса A, была допустима и работа 
с 
объектами класса B. Но в нашем примере это совсем не так. 
r Мы не видим явно, что класс B лишь расширяет возможности A, а не является от- 

дельной сущностью. 
r Мы должны обращаться к "части A" класса B через $obj->a->TestA(), а к чле- 
нам самого класса B как $obj->TestB(). Последнее может быть довольно утоми- 
тельным, если, как это часто бывает, в B будет использоваться очень много мето- 

дов из A и гораздо меньше — из B. Кроме того, это заставляет нас постоянно 
помнить о внутреннем устройстве класса B. 
Впрочем, такой способ расширения также иногда находит применение. Мы погово- 
рим об этом чуть позже. А пока рассмотрим, что же представляет собой 
наследование 
(или расширение возможностей) классов. 
class B extends A { 
function B(параметры_для_A, другие_параметры) 
{ $this->A(параметры_для_A); 
инициализируем другие поля B 

Глава 31. Объектно-ориентированное программирование на PHP 463 
} 
function TestB() {
 
<<-[Весь Текст]
Страница: из 287
 <<-