♦ необходимости повторной модификации членов для повторного использования объекта. Иногда по невнимательности в очередном проекте можно создать новые ошибки. Как раз этого мы стремимся избежать.
Хорошее практическое правило: проектируйте класс так, чтобы в нем были сервисы, выполняющие все, что вы собираетесь делать с объектом. Никогда не обращайтесь к членам извне класса и всегда надлежащим образом инкапсулируйте свои классы, чтобы воспользоваться преимуществами сокрытия информации. Некоторые языки дают возможность вообще запрещать доступ к членам, объявляя их закрытыми или защищенными от доступа извне. В настоящее время РНР не обладает такими возможностями, но весьма полезно придерживаться правильных приемов кодирования.
Наследование
Поговорив об основных конструктивных элементах объектно-ориентированной программы и некоторых хороших эвристиках, займемся практическим применением возможностей, предоставляемых объектным подходом, для создания четких стратегий решения сложных задач.
Допустим, мы хотим организовать интернет-магазин информационных носителей типа amazon.com. Предположим, что мы хотим торговать компакт-дисками, программами, VHS и DVD, а также книгами. В традиционном функциональном программировании мы могли бы попытаться создать обычную структуру для хранения данных об этих носителях типа такой (рис. 5.2):
Очевидно, что между книгами, фильмами, компакт-дисками и программами есть много различий, поэтому может потребоваться создать некоторые дополнительные структуры для хранения данных о конкретных типах носителей (рис. 5.3).
Теперь программа, которая выводит на экран все предметы, занесенные в массив, может выглядеть так:
<?php
// создадим небольшой массив с 2 записями $medialtems = array();
$books = arrayO; $CdS = arrayO;
$item->ic = 1;
$item->type = "book";
$item->name = "Professional PHP 4";
$item->inStock = 33;
$item->price = 49.95;
$item->rating = 5;
$medialtems[] = $item;
$book->isbn = 1246534343443;
$book->author = "Ken Egervari, et. al. "; $book->numberOfPages = 500; $books[$item->id] = $book;
$item->id = 2;
$item->type = "cd";
$item->name = "This Way"; $itern->inStock = 120;
$item->price = 16.95; $item->rating = 4;
$medialtems[] = $item;
$cd->serialNo = 323254354;
$cd->artist = "Jewel";
$cd->numberOfTracks = 13; $cds[$item->id] = $cd;