Объектно-ориентированное программирование в WordPress – Наследование. Часть I

Самое трудное в написании статей по объектно-ориентированному программированию для новичков — это знать, где остановиться.

Объектно-ориентированное программирование в WordPress – Наследование. Часть I
Объектно-ориентированное программирование в WordPress – Наследование. Часть II

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

Ранее мы завершили создание нашего первого, полноценного плагина с использованием объектно-ориентированного подхода. По большей части, в нем инкапсулируется все то, что мы рассмотрели в серии статей к этому моменту (кроме, очевидно, наследования).

Это много, я знаю, но помните: цель этих статей состоит в том, чтобы подготовить абсолютного новичка ко всему, что необходимо для начала работы с PHP и для написания плагинов WordPress с использованием объектно-ориентированного подхода.

Поэтому я решил начать формировать эту серию двумя статьями (с третьей, финальной частью в качестве обобщения), которые служат переходом в следующую тему разработки для начинающих PHP программистов: Наследование.

Опять же, для тех, кто является более опытным программистом — наследование не такая уж важная тема, однако, если вы новичок — тогда наследование является одним из понятий, которое легко понять, немного сложнее реализовать (верите или нет), и которое может привести к еще большей путанице, когда речь заходит о таких вопросах, как полиморфизм (о котором мы поговорим позже).

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

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

Теперь, когда мы наметили план нашей статьи, давайте приступим к работе.

Определение наследования

В отличие от ряда других терминов программирования, «наследование» на самом деле является словом, которое очень хорошо описывает саму концепцию. Из Википедии:

В объектно-ориентированном программировании (ООП) наследование — это подход, при котором объект или класс базируется на другом объекте или классе, используя одну и ту же реализацию. Этот механизм применяется для повторного использования кода. Отношения объектов и классов через наследование порождают иерархию.


Относительно понятно, не так ли? Но думаю, можно капнуть глубже.

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

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

Я всегда стараюсь представить вещи в свете чего-то гораздо более осязаемого, более материального, что ближе к тому, что мы будем делать.

Учитывая сказанное, возникает вопрос: как соответствующим образом описать наследование в контексте объектно-ориентированного программирования, не нарушив при этом сам концепт использованием тривиальных примеров?

Давайте попробуем так:

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


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

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

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

Визуализация наследования

Прежде чем двигаться дальше, давайте рассмотрим на очень простой диаграмме классов, как работает наследование:

Визуализация наследования

Обратите внимание, что мы используем три класса:

  • класс Content, который будет служить базовым и представляет собой общий тип информации, содержащий данные для других, более конкретных типов контента.
  • класс Comment, который представляет собой комментарий на запись в блоге. Этот класс содержит информацию, которую он наследует от класса Content, и то, что определяется в нем самом.
  • Класс Post также наследует от класса Content, и представляет собой отдельную запись в блоге. Класс Post содержит общую информацию класса Content, а также свою собственную информацию, специфичную для этого класса.

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

Но сначала, нам все еще нужно прояснить несколько терминов и убедиться, что мы обладаем все необходимой информацией.

Терминология классов

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

Важно сформулировать некоторые общие определения для слов, которые мы применяем — не только потому, что мы задействовали их в этой статье, но и потому, что вы увидите, что они применяются и в других источниках, и что они взаимозаменяемы в других статьях в Интернете:

  • Родительский класс, также упоминается как базовый класс — это класс, от которого другие классы наследуют информацию, как показано на иллюстрации выше. Любой родительский класс поддерживает набор свойств и функций.
  • Обратите внимание, что некоторые функции могут быть доступны в базовом классе для сторонних классов, дочерних классов или только в самом базовом классе.
  • Дочерний класс, обычно называемый подклассом — это класс, который наследует информацию, данные и функциональность от родительского класса.
  • Мы рассмотрим код в следующей статье, однако, отмечу, что доступ к данным осуществляется только в одну сторону. То есть подклассы могут получить доступ к информации в их базовом классе, а базовые классы не знают ничего о своих подклассах.

Это должно было прояснить немало терминов, однако, если что-то осталось непонятным, думайте об этом в свете, скажем, генеалогического древа, где есть родители и дети. Дети наследуют черты своих родителей, но родители не наследуют черты своих детей.

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

Это не только ограничено в PHP, но и выходит за рамки обсуждения данной статьи.

А что насчет абстрактных классов?

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

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

Продолжение следует...

В следующей статье мы продолжим наше обсуждение наследования и рассмотрим, как его реализовать на PHP. Мы также посмотрим, как подклассы могут получить доступ к данным своих родителей, и как родительские классы могут защитить свою информацию.

До встречи!

РедакцияПеревод статьи «Object-Oriented Programming in WordPress - Inheritance I»