PHP так же как и большинство современных языков программирования высокого уровня, таких как С, Паскаль, Java и т.д. является объектно-ориентированным. В этой статье мы как раз и узнаем что же такое эти объекты на которые он ориентирован и в чем причина и польза (или вред) такой ориентации. Я думаю, что эту статью интересно будет прочитать и тем, кто изучает не PHP, а другие языки, потому что в них во всех понятия классов и объектов одинаковы, разный только синтаксис.
Мы раскроем нашу тему на примере небольшого скрипта, который называется "Штирлиц и Мюллер". У Штирлица и Мюллера на двоих имеется 0.7 литра шнапса и 0.5 литра водки. Но Мюллер является немецким офицером и может пить только шнапс, тогда как Штирлиц помимо того, что он немецкий офицер, одновременно ещё и является советским разведчиком майором Исаевым, поэтому способен пить не только шнапс, но и водку. С каждым нажатием кнопки один из них выпивает 100 грамм того или иного напитка. А теперь зайдите сюда и сделайте так, чтобы из имеющихся 1.2 литра спиртного Штирлиц выпил как минимум 0.9 литра. Но не забывайте и про Мюллера.
А теперь посмотрим как работает этот скрипт.
Вот его основной код:
<?
заголовок();
$Мюллер = new Немецкий_Офицер;
$Штирлиц = new Советский_Разведчик;
$Мюллер->имя = "Мюллер";
$Штирлиц->имя = "Штирлиц";
$Штирлиц->настоящее_имя = "майор Исаев";
extract($_POST);
статистика();
if($Желание_Мюллера =='Хочу шнапса!') {
$Мюллер->Выпить_Шнапса($Шнапс);
$Мюллер->Самочувствие();
}
if($Желание_Штирлица =='Хочу шнапса!') {
$Штирлиц->Выпить_Шнапса($Шнапс);
$Штирлиц->Самочувствие();
}
if($Желание_Штирлица =='Хочу водки!') {
$Штирлиц->Выпить_Водки($Водка);
$Штирлиц->Самочувствие();
}
$Выпитое_Горючее = $Мюллер->Выпитый_Шнапс."|".$Штирлиц->Выпитый_Шнапс."|".$Штирлиц->Выпитая_Водка;
$Мюллер->Желания();
$Штирлиц->Желания();
выпитое($Штирлиц,$Мюллер);
запасы($Шнапс, $Водка);
окончание();
exit;
Одна из прелестей PHP в том, что код можно писать не только на английском, но и на многих других языках, в том числе и на русском, что вы и видите в данном примере. ( Имена переменных, функций, классов, объектов и т.д. в PHP могут состоять не только из латинских букв, но также могут содержать знак подчеркивания _, цифры (но не должны начинаться с цифр) и любие символы из расширенного набора ASCII ( ASCII-коды от 127 до 255 (0x7f-0xff) ), куда входят и хорошо нам знакомые значки кириллицы )
Итак, начнём с начала. <? - это начало любого PHP-кода, а ?> - его конец. Всё, что находится между этими значками, сервер обрабатывает как программу на PHP, а все что за ними - как простой HTML.
Далее идёт функция заголовок().
Функция - это то же, что процедура или подпрограмма - кусок кода, который выполняет какое-то действие. Функции используются для того, чтобы не писать один и тот же код несколько раз, а, написав его единожды, вызывать его потом сколько угодно раз всего одним словом - названием функции.
В этом скрипте несколько функций:
<?
заголовок();
extract($_POST);
статистика();
$Мюллер->Выпить_Шнапса($Шнапс);
$Мюллер->Самочувствие();
$Штирлиц->Выпить_Шнапса($Шнапс);
$Штирлиц->Самочувствие();
$Штирлиц->Выпить_Водки($Водка);
$Мюллер->Желания();
$Штирлиц->Желания();
выпитое($Штирлиц,$Мюллер);
запасы($Шнапс, $Водка);
окончание();
Одна из них - встроенная ( это - extract() ), а остальные - написанные пользователем (User-defined functions).
Встроенные функции написаны на Си и находятся в самом коде PHP, подробное описание каждой из них вы можете прочитать в PHP Manual. А для того чтобы заработали user-defined функции их надо сначала описать (обычно в конце программы или в отдельном файле). Делается это так:
function заголовок() {
echo "<HTML><HEAD><TITLE>Штирлиц и Мюллер</TITLE><meta content=\"text/html ; CHARSET=windows-1251\" http-equiv=\"Content-Type\"></HEAD><BODY>";
}
echo - это встроенная функция. Она выводит текст который стоит после неё в кавычках. Если в самом выводимом тексте есть кавычки то перед каждой из них надо кинуть вот такую палочку - \
Функция заголовок() выводит на экран HTML-заголовки - название страницы и мета-таг указывающий кодировку. Кстати, если вы видите на русскоязычных страницах непонятную абракадабру вместо великого и могучего, и вам приходится самостоятельно выставлять кодировку в браузере - это означает, что вебмастер забыл вставить именно этот мета-таг. Не повторяйте чужих ошибок и всегда помните об этом, когда пишете русскоязычные страницы.
А вот теперь мы и подошли к самому интересному, к нашей основной теме "Классы и Объекты".
Если перевести этот код
$Мюллер = new Немецкий_Офицер;
$Штирлиц = new Советский_Разведчик;
с программного языка на человеческий, то он будет означать следующее:
$Мюллер - новый объект класса Немецкий_Офицер
$Штирлиц - новый объект класса Советский_Разведчик
Класс - это описание возможностей (набора функций) и переменных, которыми обладает любой объект данного класса. Польза та же, что и от функций - не нужно писать много раз одно и то же. А следовательно увеличивается скорость написания программ, облегчается понимание того, как они работают, и где могут крыться ошибки. Описав класс один раз, можно создавать сколько угодно объектов этого класса и все они будут обладать одинаковыми возможностями. Так что мы с легкостью можем написать, к примеру
$Борман = new Немецкий_Офицер;
$Шелленберг = new Немецкий_Офицер;
$Радистка_Кэт = new Советский_Разведчик;
Итак, мы установили, что класс - это не что иное, как набор функций и переменных, с которыми работают эти функции. Как и функции, классы обычно описываются в конце программы или в отдельном файле.
Посмотрим, какими же функциями обладает каждый Немецкий_Офицер:
class Немецкий_Офицер {
function Немецкий_Офицер () {
$this->Острая_Необходимость = "Хочу шнапса!";
}
function Желания() {
global $Шнапс, $Водка, $Выпитое_Горючее;
echo "Я - ".$this->имя.".
<FORM METHOD=POST>
<INPUT TYPE=hidden name=Шнапс value=$Шнапс>
<INPUT TYPE=hidden name=Водка value=$Водка>
<INPUT TYPE=hidden name=Выпитое_Горючее value='$Выпитое_Горючее'>
<INPUT TYPE=submit name=Желание_".$this->имя."а value='".$this->Острая_Необходимость."'>
</FORM><BR>";
}
function Выпить_Шнапса($Шнапс) {
global $Шнапс;
if($Шнапс != 0) {
$Шнапс=$Шнапс - 0.1;
$this->Выпитый_Шнапс = $this->Выпитый_Шнапс + 0.1;
echo $this->имя." только что выпил 100 грамм шнапса.<BR>Шнапса осталось $Шнапс литра.<BR>";
} else {
echo "Шнапс кончился.<BR>";
}
}
function Самочувствие() {
if($this->Выпитый_Шнапс + $this->Выпитая_Водка > 0.8) {
echo $this->имя." выпил ".$this->Выпитый_Шнапс." литра шнапса и ".$this->Выпитая_Водка." литра водки.<BR>";
echo $this->имя." склонился над картой Советского Союза.<BR>";
echo "Его неудержимо рвёт на Родину.<BR>";
окончание();
exit;
} elseif($this->Выпитый_Шнапс or $this->Выпитая_Водка) {
echo $this->имя."у хорошо. Но он хочет ещё.<BR><BR>";
}
}
}
Как видим, он может рассказать нам о своих Желаниях(), Выпить_Шнапса() и поведать о своем Самочувствии() после выпитого.
В этом классе есть ещё одна функция - Немецкий_Офицер(). Она особенная и отличается от всех других, тем, что её название в точности совпадает с названием самого класса. Такая функция называется конструктор. Слово "конструктор" в английском языке значит совсем не то, что в русском, а обозначает того, кто что-то конструирует. Конструктор - это функция которая выполняется автоматически, когда создаётся (конструируется) новый объект данного класса. То есть когда рождается каждый новый Немецкий_Офицер он сразу начинает испытывать естественную для каждого истинного Немецкого_Офицера Острую_Необходимость Выпить_Шнапса.
Information
- Posted on 27.04.2013 16:16
- Просмотры: 2926