| |
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() {
|
|