Заметки про ООП в PHP

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

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

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

Призыв вводить методы для модификации атрибутов.

Правило именования классов - class.ИмяКласса.php

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

Переменная $this указывает на текущую реализацию класса. Класс ссылается сам на себя.

Необходимо, как универсальное средство класса получить доступ к самому себе, так как имя будущего объекта заранее не известно.

Обязательное использование методов доступа (getИмяАтрибута и setИмяАтрибута) для получения и модификации атрибутов. При этом сами атрибуты нужно делать приватными (private) или защищенными (protected).

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

Правило именования приватных атрибутов и методов - перед именем ставится _ знак нижнего подчеркивания.

Опять же - рекомендация, но это упростит чтение и понимание кода.

Всего существуют три уровня доступа к атрибутам и методам.
public - доступны напрямую из вне класса.
private - доступны только внутри класса в котором объявлены.
protected - доступны внутри класса в котором объявлены и в классах потомках.

Старайтесь использовать private и protected.

Создавайте конструкторы только при необходимости.

Если при разработке класса не требуется выполнять первичную инициализацию атрибутов, то конструктор не нужен.

Пример использования деструктора.

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

Наследование решает проблему дублируемого кода.

Пользуйтесь наследованием. Создавайте, как можно более гибкие иерархии наследования. Это позволит избежать дублирования кода и упростит последующую его модификацию, так же отлов багов станет проще. Наследование осуществляется с помощью ключевого слова extedns.

Использование в потомке методов родителя.

Что бы вызвать в подклассе метод родительского класса необходимо использовать ключевое слово parent и :: двойное двоеточие. Весь синтаксис выглядит так parent::ИмяРодительскогоМетода().

Перегрузка методов.

Родительские методы можно перегружать - изменять. Как полностью переписывая, так и дополняя функционал с помощью parent::ИмяРодительскогоМетода() + дополнительный код.


comments powered by Disqus