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 нужно указать полное имя функции или переменной, которую вы хотите вызвать. Здесь в качестве разделителя используется значок -> ( $Штирлиц->Выпитый_Шнапс , $Штирлиц->имя и т.д.).