Классы и объекты в РНР со Штирлицом и Мюллером - Web - Shelek
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 19:16
  • Просмотры: 3733