
web - tec / PHP 5 для начинающи
.pdf

Использование PHP для управления информацией в базах данных MySQL 483
Серия глав, описывающих MySQL, заканчивается примером сценария, который позволяет управлять пользовательскими записями. MySQL в качестве сервера для хранения данных позволяет создавать высокопроизводительные приложения, размах которых ограничен только воображением разработчика.
Упражнения
1.Создайте список подходящих дескрипторов для каждого столбца в таблице. Со* вет: помните о том, что ресторанам ежедневно приходится иметь дело с множеством отдельных заказов (счетов):
|
Иденти- |
Иденти- |
|
|
|
|
|
Имя |
фикатор |
фикатор |
Ресторан Пароль Фамилия |
Всего |
|||
|
заказа |
пользо- |
|
|
|
($) |
|
|
|
вателя |
|
|
|
|
|
David |
2 |
1 |
Nandos |
12345 |
Mercer |
21.45 |
davidm@ |
|
|
|
|
|
|
|
contechst.com |
David |
4 |
1 |
Mimos |
12345 |
Mercer |
20.95 |
davidm@ |
|
|
|
|
|
|
|
contechst.com |
Nic |
3 |
2 |
St Elmos |
23212 |
Malan |
15.45 |
therot@ |
|
|
|
|
|
|
|
doggiestouch.co.za |
Brian |
5 |
4 |
Spur |
32123 |
Reid |
22.00 |
pads@ |
|
|
|
|
|
|
|
doggiestouch.co.za |
Darren |
1 |
3 |
Home |
43212 |
Ebbs |
11.85 |
Bacardi@ |
|
|
|
|
|
|
|
doggiestouch.co.za |
|
|
|
|
|
|
|
|
2.Администратор сайта решил создать страницу, на которой пользователи смогут просматривать свои предыдущие заказы и итоговые суммы. Используя принци+ пы нормализации, создайте новые таблицы, в каждой из которых будет пред+ ставлен один элемент. Присвойте каждой таблице подходящее имя и определи+ те первичный ключ. (Проверьте, уменьшат ли эти изменения избыточность при больших объемах данных.)
3.Создайте данные таблицы с помощью SQL+операторов.
4.После полугодового использования Web+сайта клиенты отметили, что сайт на+ чинает работать медленнее, когда они пытаются просмотреть свои предыду+ щие заказы. Администратор сайта изучил таблицу заказов и выяснил, что в ней теперь хранится несколько тысяч записей. Почему сайт работает медленно и как администратор может повысить скорость работы сайта? Обновите табли+ цы соответствующим образом.
5.Директор решил узнать, насколько популярен среди клиентов ресторан ‘‘Nandos’’. Какой запрос можно использовать, чтобы получить общие суммы по всем заказам: а) сделанным одним клиентом и б) в целом по ресторану ‘‘Nandos’’.
Совет: попытайтесь использовать запрос SELECT SUM(столбец).
6.Создайте сценарий, с помощью которого пользователи во время регистрации на сайте смогут вводить в базу данных информацию о себе. База данных должна быть настроена так, чтобы идентификаторы пользователей назначались авто+

484Глава 11
матически. Сразу после регистрации пользователь должен иметь возможность разместить заказ в любом из пяти ресторанов. (Для начала только в одном. Бес+ покоиться о создании завершенного интерфейса не следует ++++++ важна возмож+ ность вводить цену.) После нажатия на кнопку Заказать в таблице заказов должна создаваться новая запись с увеличенным на 1 идентификатором заказа (Order_ID) и корректным идентификатором пользователя (User_ID). Совет: же* лательно использовать сеансы для хранения идентификаторов пользователей (User_ID) при регистрации.

Введение в объектно-ориентированное программирование
Объектно+ориентированная разработка программного обеспечения может быть сложной темой для программистов, создающих преимущественно процедурный код. В данной главе рассматривается некоторая базовая теория, лежащая в основе объект+ но+ориентированного подхода, а также многосложная (иногда обескураживающая) терминология. Вы узнаете, почему объектно+ориентированные методики интересны многим программистам, как на практике можно увеличить скорость разработки сложных приложений и как легко их можно модифицировать.
В следующей главе изучается тема реализации этих методик в PHP5, а также пока+ зана их эффективность на примере разработки реального приложения.
Что такое объектно-ориентированное программирование?
Объектно+ориентированное программирование (Object+oriented programming, OOP) представляет собой особый способ мышления при создании приложений. Объекты позволяют разработчику более тщательно моделировать сущности реального мира,
атакже процессы и идеи, которые должны поддерживаться разрабатываемым при+ ложением. Вместо того, чтобы представлять приложение как поток управления, ко+ торый передает блоки данных от одной функции к другой, OOP+подход позволяет мо+ делировать приложение в виде множества сотрудничающих объектов, которые независимо выполняют определенные действия.
Например, при постройке здания водопроводчики занимаются трубопроводами,
аэлектрики электрической проводкой. Водопроводчикам не нужно знать, на какой


Введение в объектно*ориентированное программирование 487
Вся функциональность класса содержится в одном PHP+файле. Изменение класса Person немедленно повлияет на все зависимые от этого класса процессы приложе+ ния, что значительно упрощает поиск и устранение ошибок и делает добавление но+ вых функций сравнительно безболезненной задачей.
Всложной программной архитектуре преимущества модульности могут оказаться не+ оценимыми. Однажды автору пришлось работать над проектом с более чем 200 000 строк процедурного PHP+кода. Около 65 процентов времени, потраченного на устранение ошибок, пошло на поиск расположения некоторых функций и определение того, какие данные взаимодействуют с той или иной функцией. Результатом воссоздания этого про+ граммного обеспечения в OO+архитектуре стало резкое уменьшение количества кода, что в свою очередь означало не только уменьшение объемов работы (если бы это стави+ лось на первое место), но и меньшее количество ошибок (чем меньше кода, тем меньше источников проблем), а также более короткий цикл их устранения.
Поскольку OO+подход заставляет разработчика продумывать организацию кода, новым членам коллектива разработчиков впоследствии будет гораздо проще понять структуру существующего приложения; появляется оболочка, которая показывает расположение новых функций.
Вкрупных проектах часто задействованы большие коллективы разработчиков, обычно состоящие из программистов с различным уровнем подготовки. И снова очевидны пре+ имущества OO+подхода перед процедурным программированием. Объекты скрывают от пользователей детали своей реализации. Вместо необходимости разбираться в сложных структурах данных и всех тонкостях бизнес+логики новички могут, пользуясь лишь крат+ кой документацией, начать использование объектов, созданных ведущими членами ко+ манды. Сами объекты отвечают за изменение данных или состояния системы.
Если бы в упомянутом выше крупном приложении использовался бы процедурный код и дальше, то достаточное для продуктивной работы ознакомление новых членов коллектива с приложением заняло бы до двух месяцев. Как только данное программ+ ное обеспечение было переработано с использованием объектно+ориентированного кода, новые члены команды смогли вносить в код существенные дополнения уже че+ рез несколько дней. Они могли быстро использовать даже самые сложные объекты, потому что для этого не нужно было полностью понимать детали реализации содер+ жащейся в данных объектах функциональности.
Теперь читатель хорошо представляет себе цель использования OO+принципов
вкачестве основного метода программирования. В последующих разделах предлага+ ется более подробный разбор фундаментальных понятий, лежащих в основе объект+ но+ориентированного программирования. В двух следующих главах читатель, вероят+ но, найдет для себя полезные идеи и познакомится с преимуществами OO+подхода.
Основные понятия OO-программирования
В данном разделе представлены элементарные понятия объектно+ориентирован+ ного программирования, а также их взаимосвязь. (В главе 13 рассматривается специ+ фическая реализация этих понятий в PHP5.) Далее рассматриваются:
классы, которые являются ‘‘чертежами’’ для объектов и фактическим кодом, определяющим свойства и методы этих объектов;
объекты, которые представляют собой работающие экземпляры класса и со+ держат все внутренние данные и информацию о состоянии, необходимую для работы приложения;

488Глава 12
наследование, которое позволяет определять один класс как подвид другого класса (почти так же, как квадрат является подвидом прямоугольника);
интерфейсы, представляющие собой наборы четко определенных условий для выполнения несвязанными объектами одной общей функции;
инкапсуляция, которая представляет собой способность объекта ограничивать доступ к своим внутренним данным.
Попутно рассматривается полиморфизм, позволяющий определять класс как член одного или нескольких категорий классов (так же как автомобиль ++++++ это ‘‘объект, имеющий двигатель’’ и одновременно ‘‘объект, имеющий колеса’’).
Классы
Вреальном мире объекты обладают определенными свойствами и поведением. Автомобиль имеет цвет, вес, марку и бензобак определенного объема. Все это харак+ теристики автомобиля. Автомобиль может набирать скорость, останавливаться, пода+ вать сигналы поворота и звуковой сигнал. Эти действия ++++++ поведение автомобиля. Указанные характеристики и поведение являются общими для всех автомобилей. Не+ смотря на то, что разные автомобили могут быть окрашены в различные цвета, цвет имеют все автомобили. OO+программирование, используя конструкцию, которая на+ зывается классом, позволяет выразить идею о том, что автомобиль ++++++ это объект, имеющий все вышеупомянутые характеристики. Класс представляет собой состоящий из переменных и функций блок кода, который описывает характеристики и поведе+ ние всех членов какого+либо множества. Например, класс с именем Car может описы+ вать общие для всех автомобилей свойства и методы.
ВOO+терминологии характеристики класса называются свойствами (properties). Свойства имеют имена и значения. Значения некоторых свойств можно изменять, значения других нельзя. Например, у класса Car, вероятно, были бы такие свойства, как color (цвет) и weight (вес). Хотя цвет машины можно изменить, перекрасив ее, вес машины (без груза и пассажиров) является фиксированным значением.
Некоторые свойства представляют состояние объекта. Состояние отражает те ха+ рактеристики, которые изменяются благодаря некоторым событиям, но не обязательно изменяемые непосредственно. В приложении, которое имитирует производитель+ ность транспортного средства, класс Car может иметь свойство с именем velocity (скорость). Скорость автомобиля не может измениться сама по себе, изменение ско+ рости представляет собой следствие работы определенного количества топлива, пе+ реданного двигателю с учетом его производительности и характеристик дороги, по которой двигается машина.
Поведение класса, т.е. действия, связанные с классом, называются методами (methods). Методы реализованы в виде функций. Как и функции, методы могут принимать пара+ метры любого допустимого типа данных. Методы воздействуют на внешние данные, переданные им в виде параметров, либо на свойства своего объекта. Методы могут использовать свойства своего объекта, чтобы определить возможность выполнения того или иного действия (например, метод accelerate определяет количество ос+ тавшегося топлива, чтобы выяснить, может ли машина разогнаться). Кроме того, ме+ тоды могут изменять состояние объекта путем изменения значений его свойств (например, метод accelerate изменяет значение свойства скорость).

Введение в объектно*ориентированное программирование 489
Объекты
Класс можно представить как чертеж для создания объекта. Почти так же как по одному чертежу можно построить множество домов, из класса можно создать множе+ ство объектов. Однако на чертеже не указаны такие характериатики, как цвет стен или тип пола. На чертеже просто показано, что у дома будут стены и пол. Классы ра+ ботают почти так же. Класс определяет поведение и характеристики объекта, но не обязательно значения этих характеристик. Объект (object) ++++++ это определенная сущ+ ность, созданная с помощью чертежа, представленного классом. Так идея дома анало+ гична классу, хотя сам дом (частный экземпляр идеи дома) аналогичен объекту.
При наличии чертежа и определенных строительных материалов можно постро+ ить дом. В OO+программировании для создания объекта используется класс. Процесс создания объекта из класса называется созданием экземпляра класса. Для создания объ+ екта требуется две вещи:
область памяти, в которую помещается объект; она автоматически выделяется PHP;
данные, которые станут значениями свойств; эти данные могут поступать из ба+ зы данных, неструктурированного текстового файла, другого объекта или како+ го+либо иного источника.
Класс в отличие от его объекта никогда не имеет значений свойств или состояния. Прежде чем клеить обои или делать наружную обшивку, необходимо с помощью чер+ тежа построить дом. Аналогично, прежде чем взаимодействовать со свойствами объ+ екта или вызывать его методы, необходимо создать объект класса. Новички в OO+ программировании часто вместо слова ‘‘объект’’ употребляют слово ‘‘класс’’ и наобо+ рот. Запомните, что классы используются во время разработки, когда вносятся изме+ нения в методы или свойства, а с объектами мы имеем дело во время выполнения программы, когда свойствам присваиваются значения и вызываются методы.
Как только объект создан, его можно использовать в работе, реализуя бизнес+ требования приложения. Рассмотрим, как это делается в PHP.
Создание класса
Начнем с простого примера. Сохраните следующий код в файле с именем class.Demo.php:
<?php
class Demo {
}
?>
Этот код ++++++ определение класса Demo. Пока еще данный код не представляет осо+ бой ценности, однако он демонстрирует базовый синтаксис для объявления нового класса в PHP. Чтобы определить в PHP новый класс, используется ключевое слово class, за которым следует имя класса и фигурные скобки, указывающие на начало и конец кода этого класса.
Создать объект класса Demo можно с помощью следующего кода:
<?php require_once('class.Demo.php');

