Очень рекомендуем посетить сайт автора статьи: www.apasov.com
PHP так же как и большинство современных языков программирования высокого уровня, таких как С, Паскаль, Java и т.д. является объектно-ориентированным. В этой статье мы как раз и узнаем что же такое эти объекты на которые он ориентирован и в чем причина и польза (или вред) такой ориентации. Я думаю, что эту статью интересно будет прочитать и тем, кто изучает не PHP, а другие языки, потому что в них во всех понятия классов и объектов одинаковы, разный только синтаксис.
Мы раскроем нашу тему на примере небольшого скрипта, который называется "Штирлиц и Мюллер". У Штирлица и Мюллера на двоих имеется 0.7 литра шнапса и 0.5 литра водки. Но Мюллер является немецким офицером и может пить только шнапс, тогда как Штирлиц помимо того, что он немецкий офицер, одновременно ещё и является советским разведчиком майором Исаевым, поэтому способен пить не только шнапс, но и водку. С каждым нажатием кнопки один из них выпивает 100 грамм того или иного напитка. А теперь зайдите сюда и сделайте так, чтобы из имеющихся 1.2 литра спиртного Штирлиц выпил как минимум 0.9 литра. Но не забывайте и про Мюллера.
А теперь посмотрим как работает этот скрипт. Вот его основной код:
<? заголовок();
$Мюллер = new Немецкий_Офицер; $Штирлиц = new Советский_Разведчик;
Одна из прелестей PHP в том, что код можно писать не только на английском, но и на многих других языках, в том числе и на русском, что вы и видите в данном примере. ( Имена переменных, функций, классов, объектов и т.д. в PHP могут состоять не только из латинских букв, но также могут содержать знак подчеркивания _, цифры (но не должны начинаться с цифр) и любие символы из расширенного набора ASCII ( ASCII-коды от 127 до 255 (0x7f-0xff) ), куда входят и хорошо нам знакомые значки кириллицы )
Итак, начнём с начала. <? - это начало любого PHP-кода, а ?> - его конец. Всё, что находится между этими значками, сервер обрабатывает как программу на PHP, а все что за ними - как простой HTML.
Далее идёт функция заголовок().
Функция - это то же, что процедура или подпрограмма - кусок кода, который выполняет какое-то действие. Функции используются для того, чтобы не писать один и тот же код несколько раз, а, написав его единожды, вызывать его потом сколько угодно раз всего одним словом - названием функции.
Одна из них - встроенная ( это - 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 $Шнапс; 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>; } } }
Как видим, он может рассказать нам о своих Желаниях(), Выпить_Шнапса() и поведать о своем Самочувствии() после выпитого.
В этом классе есть ещё одна функция - Немецкий_Офицер(). Она особенная и отличается от всех других, тем, что её название в точности совпадает с названием самого класса. Такая функция называется конструктор. Слово "конструктор" в английском языке значит совсем не то, что в русском, а обозначает того, кто что-то конструирует. Конструктор - это функция которая выполняется автоматически, когда создаётся (конструируется) новый объект данного класса. То есть когда рождается каждый новый Немецкий_Офицер он сразу начинает испытывать естественную для каждого истинного Немецкого_Офицера Острую_Необходимость Выпить_Шнапса.