Глава
1 – Основные понятия объектно-ориентированного программирования в PHP5
Переход от структурного
программирования к объектно-ориентированному связан, в первую очередь, с
возрастающей сложностью создаваемого программного обеспечения. В первое время
программы не превышали нескольких сотен строк. Увеличение количества кода в
программах до нескольких тысяч строк привело к внедрению приемов структурного
программирования (появились функции), что позволило создавать и сопровождать
программы размерами до ста тысяч строк. Стремительное развитие программного
обеспечения потребовало создания и сопровождения еще большего объема кода.
Ответом на это было создание объектно-ориентированной технологии. Применение
данной технологии дает возможность создавать еще большие по объему приложения и
позволяет программисту оперировать при создании кода объектами реального мира,
а не архитектурой компьютера.
Объектно-ориентированный
подход за последние два десятилетия получил широкое распространение. Он
используется во многих языках программирования, в том числе и в PHP 5.
1.1
Сравнение структурного и объектно-ориентированного подходов к программированию
Все языки
программирования построены на абстракции. Первые ассемблеры были абстракциями
машинных кодов, программирование на которых требовало детального знания
архитектуры компьютера. Введение ассемблера позволило не запоминать огромного
числа кодов процессора и правил их применения. В свою очередь языки высокого
уровня, появившиеся вслед за ассемблером, были абстракцией ассемблера.
Появление структурного подхода к программированию характеризуется в первую
очередь применением функций, когда часть кода можно оформить в виде функции и
использовать его несколько раз в разных местах программы. Такой прием позволяет
не только повторно использовать код, но и отлаживать его небольшими блоками,
которые соответствуют конкретным задачам.
Объектно-ориентированный
подход моделирует не отдельные процессы, а объекты реального мира и их
поведение. Программа может адаптироваться к усложнению реального мира, создавая
новые типы объектов. Таким образом, объектно-ориентированный подход позволяет
описать задачу в ее терминах, а не терминах компьютера.
Сознание человека
оперирует понятиями, которые являются абстракциями отдельных предметов. Понятию
«стол» удовлетворяют все столы мира. Если уточнить понятие: «серый стол», то
данное понятие исключает из рассмотрения все столы, цвет которых отличен от
серого. Более уточненное понятие «серый стол с выдвижными ящиками» еще более
сужает число столов удовлетворяющих этому определению. Характеризуя объект
«стол» все большим числом параметров, от абстрактного понятия можно прийти к
вполне конкретному предмету.
Такой подход взяли на
вооружение создатели объектно-ориентированной технологии. В основе этой
технологии лежит конструкция, называемая классом, играющая роль «понятия».
Класс состоит из переменных, называемых членами класса, которые содержат в себе
различные характеристики нашего понятия. У предметов могут быть как легко
заметные характеристики, так и скрытые. Так, при работе с телевизором мы можем
воспользоваться пультом управления для изменения контрастности и яркости
изображения, громкости звука, а различные микросхемы и другие детали устройства
телевизора скрыты от нас корпусом и не доступны в повседневном обращении. Точно
так же и члены класса могут быть открытыми и закрытыми.
Помимо статических
характеристик, у объектов имеются так же характеристики, связанные с их
поведением или действиями, совершаемыми над ними. Такие динамические
характеристики объекта моделируются в классе отдельными функциями, называемыми
методами класса.
Таким образом, классы –
это конструкции, моделирующие наши понятия. Класс применяют как расширенный тип
переменной. Только при объявлении такой «переменной» мы получаем не обычную
переменную, а модель объекта, которую далее будем называть просто объектом. При
этом объект разделен на две части: закрытую, которая доступна только функциям
внутри объекта, и открытую, которую можно вызвать для этого объекта из текста
основной программы.
Уточнение класса
(понятия) происходят с помощью специального механизма, названного наследованием.
При объявлении класса можно узнать, что новый класс наследует от уже
существующего.
Помимо наследования,
существует другой тип отношений, называемый агрегацией. Классы могут в качестве
членов содержать другие объекты. Если класс «водный транспорт» может быть
базовым для подводной лодки, крейсера, лайнера, то в свою очередь любой из
кораблей может содержать такие объекты, как палуба, двигатель, навигационное
оборудование и т.д. Причем количество и вид объектов, содержащихся в классе, не
ограничено.
1.2
Класс как абстрактный тип
Класс это конструкция,
задающая образец, по которому будет построен объект. Образно говоря, можно
представить его как форму, с помощью которой отливают детали на
металлургических производствах. Единожды разработав такую форму с нужными
геометрическими параметрами, можно отлив из нее любое количество деталей,
которые будут точными копиями друг друга и этой формы. Точно так же в
программе, один раз написав класс, можно затем создавать любое количество объектов
этого класса, которые будут содержать все переменные и методы, которые есть у
их класса.
Объявление класса
осуществляется с помощью ключевого слова class, за которым следуют название
класса и компоненты класса в фигурных скобках.
Объект класса объявляется
с помощью ключевого слова new, за которым следует название класса. Как только
объект класса объявлен, появляется возможность обращаться к его компонентам с
помощью уточненного имени, которое включает имя объекта, следующую за ним
стрелку (->) и имя метода и члена класса.
Методы и члены класса
могут вызываться не только из внешней программы, но и из самого класса. Для
того чтобы обратиться к переменной или методу класса внутри класса, это
обращение необходимо предварить конструкцией $this->. Переменная $this,
которая неявно присутствует в каждом классе, является ссылкой на текущий объект
класса и сообщает интерпретатору PHP, что вы обращаетесь к переменной данного
класса, а не создаете новую. Членам класса можно присваивать значения, как
обычным переменным программы.
1.3
Конструкторы и деструкторы
Среди методов класса
различают два особых метода: конструктор и деструктор. Конструктор – это
специальный метод класса, предназначенный для инициализации членов класса. Этот
метод выполняется раньше всех остальных методов класса во время объявления
объекта. В конструкторе обычно осуществляют инициализацию членов класса и
резервирование ресурсов, необходимых для работы объекта, - выполняется открытие
файлов, соединение с базой данных и т.д. Для того чтобы использовать в классе
конструктор, необходимо объявить в нем метод с именем _construct().
Деструктор – это
специальный метод класса, предназначенный для освобождения ресурсов, занятых
объектом во время его существования. Этот метод всегда вызывается после всех
остальных методов во время уничтожения объекта. В нем можно закрыть открытые
файлы, отсоединиться от базы данных.
Конструктор и деструктор
– это ключевые методы класса. Их наличие является одним из признаков
объектно-ориентированной технологии. Но это не значит, что в каждом классе
обязательно должны быть констуктор и деструктор – это необязательные элементы
класса и их следует применять только при необходимости.
1.4
Объекты
Объекты объявляются с
помощью ключевого слова new и являются экземпляром класса. Можно объявить
несколько объектов (экземпляров) класса, точно так же как одному понятию стола
может соответствовать несколько реальных столов, а из одной литейной формы
можно получить много деталей.
Объекты являются такими
же полноценными переменными. Можно создавать массив объектов, но при работе с
ним необходимо учитывать особенности объявления и оперирования объектами.
Объекты, как и обычные
переменные, можно передавать в качестве аргумента функции. Они могут выступать
не только как параметры функций, но и как возвращаемые значения. Возвращаемый
объект можно присвоить другому объекту или вызвать его методы или члены
непосредственно.
Глава 2 – Реализация
класса
Создаваемый нами класс
будет называться Url_nav представлять собой массив и переменную:
$link_and_text_list –
массив ссылок, в котором будут храниться адреса ссылок и текст к ним.
$delitmer – разделитель
ссылок.
Для успешной работы
класса нам понадобятся три метода:
функция, изменяющая стиль
посещенных ссылок
функция, изменяющая стиль
ссылок при наведении курсора мыши
функция, изменяющая стиль
не посещенных ссылок
функция, которая будет
добавлять обычную ссылку элемент в массив
функция, которая будет
добавлять ссылку-рисунок в массив
функция, создающая
горизонтальное меню навигации из массива
функция, создающая
вертикальное меню навигации из массива
функция создающая
заголовок
Опишем каждый метод
класса более подробно.
2.1
Функция l_visited_style (изменение стиля посещенных ссылок)
При вызове функции
пользователю надо будет ввести четыре параметра:
$color – цвет ссылок
$t_decor – оформление
ссылок (например подчеркивание)
$f_size – размер шрифта
ссылок
$f_font – название шрифта
ссылок
Реализация функции на
языке PHP будет иметь следующий вид:
function
l_visited_style($color, $t_decor, $f_size, $f_font)
{
echo('<STYLE
type="text/css"> A:visited');
echo("{");
if
($color!="")
{
echo("color: ");
echo($color);
echo(";");
}
else
{
echo('color:
#5f0000;');
}
if
($t_decor!="")
{
echo('text-decoration: ');
echo($t_decor);
echo(';');
}
else
{
echo('text-decoration: none;');
}
if
($f_size!="")
{
echo('font-size: ');
echo($f_size);
echo('pt;');
}
else
{
echo('font-size: 12pt;');
}
if
($f_font!="")
{
echo('font-family: ');
echo($f_font);
echo(';}');
}
else
{
echo('font-family: Arial;');
}
echo("}</STYLE>");
}
2.2
Функция l_hover_style (изменение стиля ссылок при наведении)
При вызове функции
пользователю надо будет ввести четыре параметра:
$color – цвет ссылок
$t_decor – оформление
ссылок (например подчеркивание)
$f_size – размер шрифта
ссылок
$f_font – название шрифта
ссылок
Реализация функции на
языке PHP будет иметь следующий вид:
function
l_hover_style($color, $t_decor, $f_size, $f_font)
{
echo('<STYLE
type="text/css"> A:hover');
echo("{");
if
($color!="")
{
echo("color: ");
echo($color);
echo(";");
}
else
{
echo('color:
#000000;');
}
if
($t_decor!="")
{
echo('text-decoration: ');
echo($t_decor);
echo(';');
}
else
{
echo('text-decoration: blink, underline;');
}
if
($f_size!="")
{
echo('font-size: ');
echo($f_size);
echo('pt;');
}
else
{
echo('font-size: 12pt;');
}
if
($f_font!="")
{
echo('font-family: ');
echo($f_font);
echo(';}');
}
else
{
echo('font-family: Arial;');
}
echo("}</STYLE>");
}
2.3
Функция l_link_style (изменение стиля не посещенных ссылок)
При вызове функции
пользователю надо будет ввести четыре параметра:
$color – цвет ссылок
$t_decor – оформление
ссылок (например подчеркивание)
$f_size – размер шрифта
ссылок
$f_font – название шрифта
ссылок
Реализация функции на
языке PHP будет иметь следующий вид:
function
l_link_style($color, $t_decor, $f_size, $f_font)
{
echo('<STYLE
type="text/css"> A:link');
echo("{");
if ($color!="")
{
echo("color: ");
echo($color);
echo(";");
}
else
{
echo('color:
#5f0000;');
}
if
($t_decor!="")
{
echo('text-decoration: ');
echo($t_decor);
echo(';');
}
else
{
echo('text-decoration: none;');
}
if
($f_size!="")
{
echo('font-size: ');
echo($f_size);
echo('pt;');
}
else
{
echo('font-size: 12pt;');
}
if
($f_font!="")
{
echo('font-family: ');
echo($f_font);
echo(';}');
}
else
{
echo('font-family: Arial;');
}
echo("}</STYLE>");
}
2.4
Функция add_item (добавляет элемент в массив)
При вызове данной функции
пользователю надо будет ввести два параметра:
$title – отображаемый
текст ссылки
$s_url – адрес, на
который указывает ссылка
Таким образом, всю
функцию можно описать следующей последовательностью действий:
определение конца массива
добавление в массив
переменной $title
добавление в массив
переменной $s_url
После перевода алгоритма
на язык PHP получим следующую функцию:
function add_item($title,
$s_url)
{
$n=sizeof($this->link_and_text_list);
$this->link_and_text_list[$n]['title']=trim($title);
$this->link_and_text_list[$n]['url']=trim($s_url);
}
2.5
Функция add_img_item (добавляет ссылку-рисунок в массив)
При вызове данной функции
пользователю надо будет ввести три параметра:
$title – альтернативный
текст
$s_url – адрес, на
который указывает ссылка
$image – путь к рисун
Таким образом, всю
функцию можно описать следующей последовательностью действий:
определение конца массива
добавление в массив тега
IMG с путем к рисунку заданным переменной $image и альтернативным текстом из
переменной $title
добавление в массив
переменной $s_url
После перевода алгоритма
на язык PHP получим следующую функцию:
function
add_img_item($title, $s_url, $image)
{
$n=sizeof($this->link_and_text_list);
if
($image!="")
{
$this->link_and_text_list[$n]['title']="<IMG
SRC=".trim($image)." BORDER=0
ALT='".trim($title)."'>";
}
$this->link_and_text_list[$n]['url'].=" ".trim($s_url);
}
2.6
Функция gor_nav_create (создает горизонтальное меню навигации из массива)
Функция должна
последовательно выводить все ссылки, введенные ранее в массив $link_and_text_list,
через разделитель заданный в переменной $delitmer.
Реализация функции на
языке PHP будет иметь следующий вид:
function gor_nav_create()
{
$links_arr=$this->link_and_text_list;
$str = "";
$c=sizeof($links_arr);
for ($i=0; $i<$c;
$i++)
{
if
(!$links_arr[$i]['url'])
{
$str .=
$links_arr[$i]['title'];
} else {
$str .=
"<a href=\"".$links_arr[$i]['url']."\"
target=\"_self\">".$links_arr[$i]['title']."</a>";
}
if ($i<$c-1)
{
$str .=
$this->delitmer;
}
}
return $str;
}
2.7
Функция vert_nav_create (создает вертикальное меню навигации из массива)
Функция должна
последовательно выводить все ссылки, введенные ранее в массив
$link_and_text_list с переходом на следующую строк
Реализация функции на
языке PHP будет иметь следующий вид:
function
vert_nav_create()
{
$links_arr=$this->link_and_text_list;
$str = "";
$c=sizeof($links_arr);
for ($i=0; $i<$c;
$i++)
{
if
(!$links_arr[$i]['url'])
{
$str .=
$links_arr[$i]['title'];
} else {
$str .=
"<a href=\"".$links_arr[$i]['url']."\"
target=\"_self\">".$links_arr[$i]['title']."</a>"."<BR>";
}
}
return $str;
}
2.8
Функция title_create() (создает заголовок страницы)
Данная функция будет
выводить в заголовок страницы часть массива, содержащую текст из ссылок (через
разделитель).
Реализация функции на
языке PHP будет иметь следующий вид:
function title_create()
{
$links_arr =
array_reverse($this->link_and_text_list);
$str = "";
$c =
sizeof($links_arr);
for ($i=0; $i<$c;
$i++)
{
$str .=
$links_arr[$i]['title'];
if ($i<$c-1)
{
$str .=
$this->delitmer;
}
}
return
"<title>".$str."</title>";
}
}
2.9 Пример использования
Для того чтобы
проиллюстрировать использование созданного нами класса введем следующий код PHP
(результат его выполнения показан на Рис. 1) :
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>ReFolder
- О проекте</TITLE>
</HEAD>
<BODY
bgcolor="#FFFFFF" text="#000000">
<TABLE BORDER=0
WIDTH=100% HEIGHT=100%>
<TR>
<TD WIDTH=300
HEIGHT=90 ALIGN = "center" VALIGN = "middle"><IMG SRC
= "Logo.jpg"></TD>
<TD ALIGN =
"center" VALIGN="bottom">
<?php
$nav = new Url_nav(); //
создание нового экземпляра класса
$nav ->
l_visited_style("","","","");//изменение
стиля посещенных ссылок
$nav ->
l_hover_style("","","","");//изменение
стиля ссылок при наведении
$nav ->
l_link_style("","","","");// изменение
стиля непосещенных ссылок
$nav -> delitmer =
" < "; // установка разделителя
$nav ->
add_item("О проекте", "index.htm");
$nav ->
add_item("Рефераты", "referats.htm"); // добавление
элементов
$nav ->
add_item("Библиотека", "bibl.htm");
$nav ->
add_item("Решения и ответы", "otveti.htm");
$nav ->
add_item("Программы", "program.htm");
$nav -> delitmer =
" > "; // изменение разделителя
echo $nav ->
gor_nav_create(); // создание и вывод панели навигации со ссылками
echo("</TD>
</TR>
<TR>
<TD WIDTH=300
VALIGN='top' ALIGN = 'left'>
<IMG SRC
= 'MenuLine.jpg'><BR>");
$nav2 = new Url_nav();
$nav2 = new Url_nav(); //
создание нового экземпляра класса
$nav2 ->
l_visited_style("","","","");//изменение
стиля посещенных ссылок
$nav2 ->
l_hover_style("","","","");//изменение
стиля ссылок при наведении
$nav2 ->
l_link_style("","","","");// изменение
стиля непосещенных ссылок
$nav2 ->
add_item("Бесплатное хранение файлов",
"http://refolder.ifolder.ru");
$nav2 ->
add_item("Заказать работу", "work.htm"); // добавление
элементов
$nav2 ->
add_item("Письмо разработчикам", "opinion.htm");
$nav2 -> add_item("Карта
сайта", "karta.htm");
$nav2 ->
add_img_item("Разделитель", "MenuLine.jpg",
"MenuLine.jpg");
echo $nav2 ->
vert_nav_create();
?>
</TD>
<TD ALIGN =
"left" VALIGN="top"><P>Доброго времени суток,
Дорогой гость.<BR>
На этом сайте вы
сможете найти большую коллекцию книг, рефератов,а так же выполненных работ по
различным предметам.<BR>
Так же здесь
хранится база ответов на некоторые курсы Intuit.ru<BR>
Теперь немного о
том как работает сайт. На сайте храняться два типа ссылок:
<OL>
<LI>Ссылки
с пометкой [iFolder] - указывают на файлы хранящиеся на сайте файлового
хостинга <A
HREF="http://refolder.ifolder.ru/">refolder.ifolder.ru</A>
(почему именно
он? Прежде всего потому что он один из немногих серверов поддерживающих
программы для закачки, что на наш взгляд крайне удобно)</LI>
<LI>Ссылки
с пометкой [ed2k] - указывают на версию файла хранящуюся в сети eDonkey2000.
Чтобы скачать подобные ссылки рекомендуем установить программу
eMule (ее можно
<A HREF="http://www.emule-project.net/">скачать с официального
сайта</A> или воспользоваться вот этой <A
HREF="http://refolder.ifolder.ru/6437769">ссылкой
[iFolder]</A>). О том как пользоваться программой eMule можно прочитать
<A HREF="rukovodstvo_eMule.zip">здесь.</A>
</LI>
</OL>
</P>
<b>P.S. Все
материалы размещенные на данном сайте носят исключительно ознакомительный
характер и должны быть удалены после просмотра.</b>
</TD>
</TR>
<TR>
<TD>
</TD><TD
ALIGN = "center">
</TD>
</TR>
</TABLE>
</BODY>
</HTML>
Рис. 1 – Результат
выполнения кода