Главная страница статей --> Советы по фотошопу, графике и хитрости в построении php кода

Классы и объекты в РНР со Штирлицом и Мюллером

Источник: http://www.apasov.com/


Страницы статьи: [1] [2] [3]

Очень рекомендуем посетить сайт автора статьи: www.apasov.com


class Советский_Разведчик extends Немецкий_Офицер {

    function
Советский_Разведчик () {
       
$this->Острая_Необходимость = Хочу шнапса!;
       
$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>;
        }
    }
}

Обратите внимание на первую строчку:

class Советский_Разведчик extends Немецкий_Офицер {

В переводе на русский это значит, что класс Советский_Разведчик расширяет класс Немецкий_Офицер. То есть, каждый заброшенный в тыл врага Советский_Разведчик является одновременно Немецким_Офицером. Поэтому ему доступны все функции Немецкого_Офицера - рассказать нам о своих Желаниях(), Выпить_Шнапса() и поведать о своем Самочувствии(), но также он может совершить действие недоступное ни одному Немецкому_Офицеру - Выпить_Водки()!!!

Это отражается и на его конструкторе. Как видим, каждый уважающий себя Советский_Разведчик при появлении на свет испытывает не только естественную для Немецкого_Офицера Острую_Необходимость Выпить_Шнапса, но также и Срочную_Необходимость Выпить_Водки без которой не может существовать ни один истинный Советский_Разведчик.

Эта ситуация, когда один класс (дочерний (child)) получает от другого (родительского (parent)) все его возможности, называется наследованием. Дочерний класс получает наследство от своего родителя, но при этом имеет вдобавок свои собственные способности.

Если одна и та же функция есть как у родительского,так и у дочернего классов (в данном случае Желания()) то дочернему классу одноименная функция родителя будет недоступна и он будет выполнять свою собственную. Но как же можно допустить чтобы доблестному Советскому_Разведчику могли быть недоступны какие-то функции Немецкого_Офицера? Для этих целей по рекомендации советской внешней разведки разработчиками PHP был введен специальный оператор ::

Теперь внутри одного класса можно вызвать функцию из другого класса написав следующее:

Немецкий_Офицер::Желания();

Так как Немецкий_Офицер является parentом для Советского_Разведчика, название класса Немецкий_Офицер можно также заменить ключевым словом parent:

parent::Желания();

Это приятное обстоятельство позволяет Советскому_Разведчику иметь желания как Советского_Разведчика (Выпить_Водки) так и Немецкого_Офицера (Выпить_Шнапса).

Итак, повторим еще раз, чтобы получше запомнить, класс - это набор переменных и функций, работающих с этими переменными. Любая переменная данного класса внутри описания этого класса должна начинаться с ключегого слова $this после которого следует знак разделения -> и только потом собственно имя переменной. $this (в переводе на русский - "этот") ставится вместо названия объекта над которым производится действие. Например, при выполнении функции Выпить_Шнапса() над объектом Мюллер переменные изменятся следующим образом:

Сначала мы создаем объект Мюллер и присваиваем переменной имя объекта Мюллер значение "Мюллер"

$Мюллер = new Немецкий_Офицер;
$Мюллер->имя = Мюллер;
$Мюллер->Выпить_Шнапса($Шнапс);

а затем выполняем функцию Выпить_Шнапса()

[ function Выпить_Шнапса($Шнапс) {
        global
$Шнапс;
        if(
$Шнапс != 0) {
            
$Шнапс=$Шнапс - 0.1;
            
$this->Выпитый_Шнапс = $this->Выпитый_Шнапс + 0.1;
            echo
$this->имя. только что выпил 100 грамм шнапса.<BR>Шнапса осталось $Шнапс литра.<BR>;
        } else {
            echo
Шнапс кончился.<BR>;
        }
    }
/
CODE]

При выполнении этой функции $this->имя будет соответствовать $Мюллер->имя и иметь значение Мюллер.

Строка кода

echo $this->имя. только что выпил 100 грамм шнапса.

выведет на экран:

Мюллер только что выпил 100 грамм шнапса.

После исполнения функции глобальная переменная $Шнапс (глобальная - потому что на неё влияют и Штирлиц и Мюллер, она рассматривается в глобальном аспекте, то есть не только внутри отдельного класса или функции, а в масштабе всего скрипта полностью) уменьшится на 0,1 литра. А переменная $Мюллер->Выпитый_Шнапс (принадлежащая только объекту $Мюллер и никому другому) увеличится на 0,1 литра.

Аналогично, когда ту же функцию будет вызывать объект $Штирлиц, слово $this будет заменено на $Штирлиц и те же самые действия будут произведены над переменными объекта $Штирлиц.

На этот раз строка кода

echo $this->имя. только что выпил 100 грамм шнапса.

выведет на экран:

Штирлиц только что выпил 100 грамм шнапса.

Классы и объекты можно сравнить с деревом папок в файловой системе.

Классы

В папке Немецкий_Офицер могут существовать две различные папки с одним и тем же названием (например, Выпитый_Шнапс) если они находятся в различных поддиректориях ( Штирлиц и Мюллер соответственно ).

Так же как в файловой системе, где для того чтобы найти определённый файл, нужно указать полный путь к нему - C:/Чужие Документы/Классы/Немецкий_Офицер/Объекты/Штирлиц/Выпитый_Шнапс используя в качестве разделитеся значок / , точно так же и в PHP нужно указать полное имя функции или переменной, которую вы хотите вызвать. Здесь в качестве разделителя используется значок -> ( $Штирлиц->Выпитый_Шнапс , $Штирлиц->имя и т.д.).

Ну, вот в принципе и всё.

И, в заключение, полный исходник скрипта:



Похожие статьи:
- *.JS, когда грузиться думаешь?
- Работа с сессиями в perl
- Image::Magick или фотошоп для perl
- Приватность в Интернет
- Подпись или аватар на пхп
- Сбор статистики на PHP
- Классы и объекты в РНР со Штирлицом и Мюллером
- Как назвать Web-сайт?
- Дядя Гугл — великан
- Разработка фирменного стиля
- Сверхдинамичные веб-интерфейсы
- Оптимизация для MSN
- RSS генератор


Оглавление | Обсудить на форуме | Главная страница сайта | Карта сайта |

Контакты
Редакция:
[0.001]