PHP: Введение в ООП
Теория: Инкапсуляция
В общепринятом ООП есть один термин, которым любят пугать новичков. Имя ему — инкапсуляция.
В первой части этого курса мы строили абстракции, используя обычные функции с применением подхода data hiding.
В объектно-ориентированном подходе функции объединяются с данными и описываются вместе внутри класса (в классово-ориентированных языках). Инкапсуляция — механизм, позволяющий описывать данные и функции, оперирующие ими, в рамках одной языковой конструкции. В случае PHP такой конструкцией является класс.
Мы уже начали так делать, когда знакомились с конструктором. Такие функции принято именовать методами, так как они связаны с объектом, на котором вызываются. Визуально вызов метода выглядит как обращение к свойству и его вызов.
Вызов метода не требует передачи объекта в аргументах, потому что метод вызывается на объекте и имеет к нему доступ через переменную $this.
Методы, которые извлекают составные части объекта, принято называть геттерами (getters), а методы, изменяющие составные части — сеттерами (setters). Как правило, геттеры и сеттеры один в один отображаются на конкретные свойства внутри объекта. Технически методы — обычные функции, за исключением доступа к $this и способа вызова.
Сеттеры в примере выше показаны только для демонстрации. В реальном коде точка почти наверняка будет неизменяемым объектом.
Но геттеры и сеттеры — не единственные типы функций, которые позволяют описывать класс. В принципе, всё, что мы описывали, работая без классов, с таким же успехом описывается и с классами.
Реализация без классов:
Реализация в классе:
Данная операция обладает свойством коммутативности: результат вычисления не зависит от того, в каком порядке идут аргументы. Соответственно, при использовании методов, можно вызывать distanceTo как на одном объекте, так и на другом.
Нередко методы выполняют не только вычисления, но и возвращают новые объекты. Например, так произойдёт при вычислении симметричной точки.
Выше мы рассмотрели техническую сторону вопроса, оставив за кадром описание преимуществ и недостатков такого подхода, а также связанные темы, например, data hiding или полиморфизм. Их описание довольно обширно и практически бесполезно без хотя бы минимального опыта использования. О том, что даёт или забирает инкапсуляция, мы поговорим на протяжении ближайших уроков. Отдельного обсуждения заслуживает вопрос о способе хранения методов — где они находятся физически (внутри объекта или нет?). С ним мы разберёмся в уроках, посвящённых полиморфизму и динамической диспетчеризации.
Рекомендуемые программы
Завершено
0 / 18
.png)


