Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

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

.pdf
Скачиваний:
119
Добавлен:
12.06.2015
Размер:
26.79 Mб
Скачать

482 Глава 11

Рис. 11.12.

Резюме

Вданной главе рассматривался процесс управления информацией, имеющейся

втаблицах базы данных, создание сценария для регистрации пользователей и сцена+ рия для протоколирования посещения страниц, которые можно использовать совме+ стно для отслеживания активности пользователей на Web+сайте. Кроме того, матери+ ал данной главы наглядно показывает, насколько просто в PHP можно реализовать аутентификацию пользователей, используя возможности управления сеансами.

Использование PHP для управления информацией в базах данных MySQL 483

Серия глав, описывающих MySQL, заканчивается примером сценария, который позволяет управлять пользовательскими записями. MySQL в качестве сервера для хранения данных позволяет создавать высокопроизводительные приложения, размах которых ограничен только воображением разработчика.

Упражнения

1.Создайте список подходящих дескрипторов для каждого столбца в таблице. Со* вет: помните о том, что ресторанам ежедневно приходится иметь дело с множеством отдельных заказов (счетов):

 

Иденти-

Иденти-

 

 

 

 

 

Имя

фикатор

фикатор

Ресторан Пароль Фамилия

Всего

E-mail

 

заказа

пользо-

 

 

 

($)

 

 

 

вателя

 

 

 

 

 

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+подход позволяет мо+ делировать приложение в виде множества сотрудничающих объектов, которые независимо выполняют определенные действия.

Например, при постройке здания водопроводчики занимаются трубопроводами,

аэлектрики электрической проводкой. Водопроводчикам не нужно знать, на какой

486 Глава 12

ток рассчитана проводка в спальне. Они заботятся только о своих задачах. Генераль+ ный конструктор гарантирует, что все субподрядчики выполняют работу, которую необходимо закончить, но не обязательно интересуются подробностями чужих задач. OOP+подход очень похож на подход, применяемый при строительстве зданий, тем, что каждый объект скрывает от остальных объектов детали своей реализации. То, как он выполняет свою работу, не касается остальных компонентов системы. Значение имеют только службы, которые способен предоставить объект.

Понятия классов и объектов, а также способы, посредством которых можно ис+ пользовать эти идеи в разработке программного обеспечения, представляют собой фундаментальные основы объектно+ориентированного программирования. OO+програм+ мирование в некотором смысле противоположно процедурному программированию, т.е. программированию с использованием функций и глобальных структур данных. Как будет показано ниже, объектно+ориентированный подход имеет значительные преимущества перед процедурным программированием, а, кроме того, новая реали+ зация объектно+ориентированных возможностей в PHP5 также дает значительный выигрыш в производительности.

Рассмотрим некоторые из огромного количества преимуществ, которые дает раз+ работчикам OO+подход.

Первое преимущество ++++++ легкость, с которой можно воплотить требования бизне+ са в модулях кода. Так как объектно+ориентированный подход позволяет моделиро+ вать приложение, опираясь на идею объектов реального мира, часто можно создавать непосредственное отображение людей, объектов и понятий в PHP+классы. Такие классы имеют те же свойства и поведение, что и представленные ими сущности ре+ ального мира, это позволяет разработчику быстро определить, какой код нужно пи+ сать и как должны взаимодействовать различные части приложения.

Второе преимущество OO+программирования заключается в повторном использо+ вании кода. В разных частях одного приложения часто требуется использовать одни и те же типы данных. Например, в приложении, которое позволяет управлять запи+ сями пациентов в больнице, определенно потребуется класс Person. В процесс лече+ ния вовлекается множество человек ++++++ пациенты, доктора, медсестры, администра+ торы, страховые агенты и т.д. На каждом этапе лечения пациента в его учетные записи необходимо вносить сведения о том, кто проводил определенное действие (например, выписку рецепта, обработку ран или отправку счета страховой компа+ нии), и проверять, имеет ли данное лицо право выполнять это действие. Определив класс Person, заключающий в себе все свойства и методы, общие для всех этих лю+ дей, разработчик получает возможность очень широкого применения повторно ис+ пользуемого кода, что не всегда возможно в процедурном программировании.

А кроме того, сколько можно создать приложений, в которых на определенном этапе обрабатывается информация об отдельных людях? Вероятно, довольно много. Хорошо написанный класс Person можно было бы легко с минимальными измене+ ниями или вообще без изменений скопировать из одного проекта в другой, и таким образом, немедленно получить ранее созданную развитую функциональность для об+ работки информации о людях. Это одно из наибольших преимуществ OO+подхода ++++++

возможность повторного использования кода не только внутри одного приложения, но и в различных проектах.

Еще одно преимущество OO+программирования связано с модульной организаци+ ей классов. Если в классе Person обнаруживается дефект или требуется добавить или изменить работу функций класса, то это необходимо сделать только в одном месте.

Введение в объектно*ориентированное программирование 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');

490 Глава 12

$objDemo = new Demo(); ?>

Чтобы создать объект, сначала необходимо убедиться, что PHP ‘‘знает’’, где искать объявление класса. Это можно сделать, подключив файл, в котором содержится класс (в данном случае class.Demo.php). Затем следует вызвать оператор new и ввести имя класса, а также открывающую и закрывающую круглые скобки. Возвращаемое данным оператором значение присваивается новой переменной, в данном случае ++++++

$objDemo, после чего можно вызывать методы объекта $objDemo, а также считывать и устанавливать его свойства, если он таковые имеет.

Очень важно иметь ясное соглашение по организации файлов с исходным кодом. Существует хорошее правило: помещать каждый класс в отдельный файл и называть этот файл class.[ИмяКласса].php.

Несмотря на то, что только что созданный класс еще ничего не делает, его код все равно представляет собой правильное определение класса.

Добавление методов

Класс Demo останется бесполезным, если не сможет выполнять какие+либо дейст+ вия, поэтому рассмотрим возможность создания методов класса. Необходимо пом+ нить, что метод класса, по существу, представляет собой функцию. В главе 6, ‘‘Создание высококачественного кода’’, уже было сказано, как создавать функции. До+ бавляя функцию внутри фигурных скобок определения класса, программист добавля+ ет этому классу метод, например:

<?php

class Demo {

function sayHello($name) { print "Hello $name!";

}

}

?>

Теперь объект, происходящий из данного класса, способен распечатывать привет+ ствие всем, кто вызовет его метод sayHello. Чтобы вызвать метод объекта objDemo, необходимо использовать оператор ->, позволяющий получить доступ к только что созданной функции. Сохраните следующий код в файле testdemo.php:

<?php require_once('class.Demo.php'); $objDemo = new Demo();

$objDemo->sayHello('Steve');

?>

Введение в объектно*ориентированное программирование 491

Теперь объект способен выводить приветствие. Оператор -> используется для доступа ко всем методам и функциям объектов.

Примечание для тех, кто познакомился с OO*программированием в других языках: оператор -> всегда используется для доступа к методам и свойствам объекта.

В OO*синтаксисе PHP оператор точка ( . ) вообще не применяется.

Добавление свойства

Добавить в класс свойство так же легко, как добавить метод ++++++ необходимо объя+ вить внутри класса переменную для хранения значения данного свойства. В проце+ дурном коде, чтобы сохранить какое+либо значение, требуется присвоить это значе+ ние переменной. В OO+программировании для хранения значения какого+либо свойства также используется переменная. Эта переменная объявляется в начале объяв+ ления класса, внутри фигурных скобок, обрамляющих код класса. Имя данной пере+ менной будет именем свойства, т.е. если переменная имеет имя $color, то свойство будет называться color.

Откройте файл class.Demo.php и добавьте в него выделенный код:

<?php

class Demo {

public $name;

function sayHello() {

print "Hello $this->name!";

}

}

?>

Добавление новой переменной $name ++++++ вот все, что требуется сделать, чтобы создать свойство name класса Demo. Для использования этого свойства применяется тот же оператор -> и имя свойства. Модифицированный метод sayHello показыва+ ет, как получить доступ к значению данного свойства.

Создайте новый файл testdemo1.php и введите в него следующий код:

<?php

require_once('class.Demo.php');

$objDemo = new Demo(); $objDemo->name = 'Steve';

$objAnotherDemo = new Demo(); $objAnotherDemo->name = 'Ed';

$objDemo->sayHello(); $objAnotherDemo->sayHello();

?>

Сохраните файл и откройте его в Web+браузере. На экране будут отпечатаны стро+ ки ‘‘Hello Steve!’’ и ‘‘Hello Ed!’’.

Соседние файлы в папке web - tec