| |
ссылок (листинг 31.4):
Глава 31. Объектно-ориентированное программирование на PHP 481
Листинг 31.4. Использование ссылок
// Массив всех уже открытых таблиц. Ключи — имена таблиц, значения —
// соответствующие объекты.
$Tables=array();
. . .
// Функция OpenTable() возвращает ссылку на объект, соответствующий
// таблице MySQL с заданным именем. Копии объектов не создаются.
function &OpenTable($name,$Fields="")
{ global $Tables;
if(!Isset($Tables[$name]))
$Tables[$name]=new MysqlTable($name,$Fields);
return $Tables[$name];
}
. . .
// Вот так мы должны использовать эту функцию.
$Tbl1=&OpenTable("MyTable"); // создает новый объект
$Tbl2=&OpenTable("OtherTable"); // создает объект
$TblEqualsTo1=&OpenTable("MyTable"); // возвращает имеющийся объект!
// Теперь $Tbl1 и $TblEqualsTo1 ссылаются на один и тот же объект.
// То есть изменение $Tbl1 тут же отразится на $TblEqualsTo1,
// и наоборот.
Опытный программист сразу же заметит в подходе предыдущего примера два значи-
тельных недостатка. Оба они связаны с несовершенством механизма управления
ссылками в PHP.
r Если пропустить перед вызовом функции оператор & (взятие ссылки), то функция
вернет не ссылку на объект, а копию этого объекта. При этом программа не вы-
даст никакого предупреждения и, скорее всего, будет даже работать верно — до
тех пор, пока для копии объекта не будет вызван метод, ради которого мы и хоте-
ли избежать копирования. Вообразите себе муки программиста, отлаживающего
такую программу, которая отказалась правильно работать по этой причине — ведь
& может быть пропущен очень далеко от того места, где возникла ошибка!
r У неопытного программиста, использующего ваш класс, может возникнуть иску-
шение скопировать $Tbl1 в новую переменную "обычным" образом — при по-
мощи оператора =. Или же он может по ошибке пропустить &, когда объявляет
функцию со ссылочным параметром.
Мы видим, что два указанных недостатка приводят к тому, что программу
становится
очень трудно отлаживать. А такие программы, как показал многолетний опыт про-
граммирования, не только никуда не годятся — они приносят разработчику лишь
огорчения, сокращая его век.
Часть V. Приемы программирования на PHP 482
Есть ли альтернатива ссылкам? Оказывается, есть. Правда, она сопряжена с
больши-
ми сложностями при разработке классов, но зато полностью лишена недостатков,
описанных выше. Это — фактическое отделение набора методов, отвечающих за
взаимодействие с объектом класса (то есть интерфейса класса) от его реализации.
Возврат интерфейса
Поговорим немного о том, что же собой представляют интерфейсы в объектно-
ориентированном программировании. Это понятие довольно сложное, и о нем напи-
сано множество томов. Я, разумеется, не собираюсь их здесь пересказывать,
потому
что эта книга — о PHP, а не об идеологии ООП.
Интерфейсы — главная "изюминка" практически всех сложных объектно-
ориентированных систем (например, COM+, CORBA) и одно из основных понятий
такого языка, как Java. Язык C++ также во всем поддерживает эту идеологию. Что
же
может дать нам PHP в этом отношении? К сожалению, довольно немного. И все-таки
даже этого хватает, чтобы избавиться от недостатков, присущих ссылкам в PHP —
во
всяком случае, для нашей задачи.
Психологи утверждают, что яркие ассоциации запоминаются особенно хорошо. Что
ж, проверим. Помните, когда мы были маленькими детьми, всем нам рассказывали
сказки. Почему бы не заняться этим вновь? Как считаете, а?.. Ну и прекрасно
(хотя я,
право, не могу знать наверняка, что вы ответили). В скобках я буду давать
коммента-
рий, ведущий параллельную линию повествования. Итак, закроем глаза и представим
себе большого кита (объект большого и сложного класса, наприм
|
|