Объектно Ориентированное Программирование в рамках PHP

Языки программирования могут классифицироваться. Различные языки программирования могут относиться к директивным, декларативным, а также объектно ориентированным и многим другим. Объектно ориентированное программирование - методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования. Не пугайтесь, это определение является академическим и далее тема будет объясняться более простым языком.

Если вы хотите ознакомиться с материалом в видео формате, вы можете найти запись в лектории или просто перейти по ссылке. Также вы сможете получить методичку и перезентацию на данную тему под видео - лекцией.

Парадигма программирования

Термин парадигма программирования - это перечень идей и правил определяющих стиль написания компьютерных программ. Другими словами парадигма программирования - это подход к написанию компьютерной программы. Не трудно догадаться, что таких подходов может быть множество. Важно понимать, что парадигма в основном не зависит от  определенного языка программирования. Практически все современные языки программирования в той или иной мере допускают использование различных парадигм. До появления объектно ориентированного стиля программирования в основном использовался процедурный стиль. Таких парадигм достаточно много, но сегодня речь пойдет исключительно о объектно ориентированной парадигме

Объектно ориентированное программирование

ООП - это программирование основанное на объектах. Разрабатывать в стиле ООП становится гораздо проще ассоциируя каждый необходимый элемент с объектом. Что такое объект в реальном мире? Это некоторый предмет, который имеет состояние, например цвет, размеры, вес, материал, а также этот объект может иметь поведения, например предмет можно поднять, передвинуть и т.д.

Давайте рассмотрим в качестве объекта самую обыкновенную книгу. Книга может иметь следующее состояние: тип обложки, размеры, количество страниц, автор и многие другие показатели. В качестве поведения можно рассмотреть такие варианты как: книгу можно читать, переворачивать страницы, переносить и т.д.

В мире программирования, состояние и поведения объекта описывается в так называемом классе. Класс представляет собой характеристику потенциального объекта. Состояния объекта называют полями или свойствами, а поведения методами.

Важно понимать, что класс - это вовсе не объект. Класс - это всего лишь описание объекта, который мы впоследствии создадим немного позднее

Давайте рассмотрим класс, который описывает потенциальный объект - печатное издание. К печатным изданиям могут относиться книги, журналы, газеты и так далее

class PrintedMatter {
    public $name;
    public $author;
    public $description;
    public $price;
    public function open()
    {
        echo ‘Книга ‘ . $this->name . ’была открыта’;
    }
}

Ключевым словом “class” мы говорим что производим декларацию класса с именем “PrintedMatter”. У данного класса было объявлено 4 поля: наименование, автор, описание и цена. Эти поля образуют состояние нашего будущего объекта. В классе также описан один единственный метод - “open()” якобы отвечающий за открытие печатного издания. Данный метод примитивно выводит сообщение, что издание с определенным для нее наименованием было открыто. Данный метод определяет поведение нашего будущего объекта.

Ключевое слово “public” является так называемым модификатором доступа. Таких модификаторов в мире PHP всего 3, но о них мы поговорим немного позднее.

Создание объекта

Описав характеристику потенциального объекта настала пора создать этот самый объект. Делается это при помощи ключевого слова “new”

$book = new PrintedMatter();

Фраза “создание объекта” порой заменяется на фразу “создание экземпляра класса”, то есть термин “объект” взаимозаменяем на термин “экземпляр класса” - это одно и тоже.

Таким образом переменная “book” теперь содержит ссылку на объект. При помощи оператора “->” мы можем получать доступ к членам нашего объекта, точнее говоря к его полям и методам, которые были описаны в классе. Например следующим образом мы присвоим полю “name” наименование нашей книги, а затем выводим его

$book->name = ‘Дикая’;

echo $book->name

В результате на экран будет выведено наименование книги

Наследование

Наследование это один из принципов объектно ориентированного программирования. На самом деле наследование является очень сильной возможностью данной
парадигмы. При помощи наследования мы можем расширять возможности нашего класса другим классом.

Давайте рассмотрим пример с печатным изданием. У нас уже есть класс “печатное издание”. По факту к печатным изданиям могут относиться книги, газеты, журналы и
т.д. У любого из этих изданий есть общие черты, например наименование, автор, описание, цена. Но бывают такие издания, которые имеют уникальные для них самих
характеристики, например у журнала может быть постер, но для книги это не применимо.

Таким образом мы можем создать класс с наименованием “Magazine” и наследовать все характеристики печатного издания от класса “PrintedMatter”, а затем определить
уникальное для журнала состояние или же поведение. Делается это следующим образом

class Magazine extends PrintedMatter
{
    public $is_poster_exists;
}

При помощи ключевого слова “extends” мы расширили класс “Magazine” на то состояние и те поведения, которые были ранее описаны в классе “PrintedMatter”. То есть создав экземпляр класса “Magazine” мы сможем иметь доступ к полям и методам, которые были описаны в классе “PrintedMatter”

$magazine = new Magazine();
$magazine->name = ‘Cool’;
echo $magazine->name;

Как результат на экран будет выведено наименование журнала.

Но в отличие от обыкновенного бумажного издания, журнал имеет уникальный показатель - наличие постера. Теперь возможно задать этот критерий через созданный экземпляр

$magazine->is_poster_exists = true;

Инкапсуляция

Инкапсуляция - это сокрытия внутренностей от внешнего во избежании повреждения или деформации. Проводя аналогию с реальным миром, два проводника изолированы
внешней оболочкой чтобы избежать короткого замыкания или удара током при соприкосновении.

В ранее приведенном примере для получения доступа к членам объекта был применен оператор “->”, но дело в том, что порой необходимо ограничить доступ к членам класса. Изолировать состояние и поведения класса возможно при помощи модификаторов доступа и таких в мире PHP всего 3:

  1. private (закрытый) - ограничивает область видимости так, что только класс, где объявлен сам элемент, имеет к нему доступ;
  2. protected (защищенный) - разрешает доступ самому классу и наследующим его классам;
  3. public (общедоступный) - разрешен отовсюду;

Ограничение области видимости и сокрытие состояния и поведения объекта и называется инкапсуляцией

В примере с печатным изданием и журналом использовался модификатор доступа “public”. При создании экземпляра класса журнала мы имели доступ ко всем его членам, но если бы мы объявили те члены класса с модификаторами доступа “private” или “protected”, то доступ к ним через объект получить уже бы не смогли. В случае с модификатором “private”, все те поля и методы которые были им помечены становятся изолированными и доступными только внутри этого класса через например псевдо переменную “$this”

В случае с модификатором “protected”, все те поля и методы которые были им помечены становятся также изолированными от внешней среды. Доступ к таким членам можно получить внутри самого класса и во всех его потомках.

Полиморфизм

Помимо классов существует такое понятие как “Интерфейс”. Интерфейсы объектов позволяют создавать код, который указывает, какие методы должен реализовать класс, без необходимости определять, как эти методы обрабатываются. Иначе говоря если класс - это описание объекта, то интерфейс это черновик для класса, то есть заключение о том, как должен выглядеть класс.

Интерфейсы объявляются так же, как и обычные классы, но с использованием ключевого слова interface вместо class. Тела методов интерфейсов должны быть пустыми.

Все методы, определенные в интерфейсе должны быть общедоступными, что следует из самой природы интерфейса. Для реализации интерфейса используется оператор “implements”. Класс должен реализовать все методы, описанные в интерфейсе, иначе произойдет фатальная ошибка.

Интерфейс для печатного издания будет выглядеть следующим образом:

interface IPrintedMatter {
    public function open();
}

Интерфейс “IPrintedMatter” декларирует метод “open”, но не описывает его реализацию.

Каждый класс реализующий этот интерфейс должен описать свое собственное поведение этого метода.

class PrintedMatter implements IPrintedMatter
{
    public $name;
    public $author;
    public $description;
    public $price;
    public function open()
    {
        echo ‘Книга ‘ . $this->name . ’была открыта’;
    }
}

Таким образом, разработчик получив интерфейс может создать свое печатное издание со своим поведением, но с тем же интерфейсом:

class MyPrintedMatter implements IPrintedMatter
{
    public $name;
    public $author;
    public $description;
    public $price;
    public function open()
    {
        echo ‘Моя собственная Книга была открыта!’;
    }
}

Этот пример один из самых очевидных объяснение принципа полиморфизма. Полиморфизм - один интерфейс, но множество реализаций. Если привести аналогию с реальным миром, то рулевая система в автомобиле имеет фактически один и тот же вид (интерфейс), но реализация в разных автомобилях может кардинально отличаться. Например в одной марке автомобиля может присутствовать гидроусилитель руля, в другой нет.

В качестве более технического примера можно привести следующее: в роли интерфейса выступает животное с одним единственным методом “голос”, а каждый конкретный класс животного описывает свою реализацию данного метода.

Заключение

ООП имеет уже более чем сорокалетнюю историю и в современном мире очень сложно представить разработку крупномасштабных проектов не используя объектно ориентированный стиль. ООП ориентировано на разработку крупных программных комплексов, разрабатываемых командой программистов.

Информация

Автор конспекта


Дата создания: 02.01.2019
Категория: Веб-разработка