Глава 6. Объектно-ориентированное программирование в PHP
Объектно-ориентированное программирование помогает описывать систему не только набором функций, но и понятными сущностями: пользователь, заказ, статья, платёж, товар, заявка. В небольшом скрипте можно обойтись функциями, но чем больше проект, тем важнее структура.
Класс и объект
Класс — это описание будущего объекта. Объект — конкретный экземпляр класса. Если класс User описывает пользователя, то объект содержит данные конкретного пользователя и методы для работы с ними.
class User
{
public $name;
public function sayHello()
{
return 'Здравствуйте, ' . $this->name;
}
}
$user = new User();
$user->name = 'Алексей';
echo $user->sayHello();
Свойства и методы
Свойства хранят состояние объекта, методы выполняют действия. Хороший класс не должен быть просто набором случайных переменных. Он должен отвечать за одну область: пользователя, заказ, файл, сообщение или настройку.
public, protected и private
Модификаторы доступа управляют тем, откуда можно обращаться к свойствам и методам. public доступен всем, protected — классу и наследникам, private — только текущему классу. В учебных примерах часто всё делают public, но в реальных проектах это быстро приводит к хаосу.
class Product
{
private $price;
public function setPrice($price)
{
if ($price < 0) {
throw new InvalidArgumentException('Цена не может быть отрицательной');
}
$this->price = $price;
}
public function getPrice()
{
return $this->price;
}
}
Конструктор
Конструктор вызывается при создании объекта. Он удобен для обязательных данных, без которых объект не имеет смысла.
class Article
{
private $title;
public function __construct($title)
{
$this->title = $title;
}
}
Наследование
Наследование позволяет создать новый класс на основе существующего. Но использовать его нужно аккуратно. Если классы связаны только внешне, лучше выбрать композицию: один объект использует другой, а не наследуется от него.
class AdminUser extends User
{
public function canEdit()
{
return true;
}
}
Интерфейсы
Интерфейс описывает контракт: какие методы обязан иметь класс. Это особенно полезно в больших проектах, где разные реализации должны работать одинаково.
interface Notifier
{
public function send($message);
}
class TelegramNotifier implements Notifier
{
public function send($message)
{
// отправка сообщения
}
}
Статические методы
Статические методы вызываются без создания объекта. Они удобны для простых вспомогательных операций, но если весь проект состоит из static-классов, это часто означает скрытый процедурный код.
Типичные ошибки
- Создание огромных классов, которые отвечают за всё сразу.
- Использование наследования там, где лучше подходит композиция.
- Открытые свойства public без необходимости.
- Смешивание SQL, HTML и бизнес-логики внутри одного класса.
Итоги
ООП в PHP нужно не ради моды, а ради управляемости проекта. Классы помогают разделять ответственность, защищать данные и строить систему из понятных частей. Для старых CMS полезно хотя бы постепенно выносить повторяющуюся логику в классы и сервисы, не ломая существующую архитектуру.