КаталогBuilderPHPDocs

Глава 6. Объектно-ориентированное программирование в PHP

Объектно-ориентированное программирование помогает описывать систему не только набором функций, но и понятными сущностями: пользователь, заказ, статья, платёж, товар, заявка. В небольшом скрипте можно обойтись функциями, но чем больше проект, тем важнее структура.

Современное примечание. Старый PHP долго развивался от процедурного стиля к ООП. Сегодня классы, интерфейсы, пространства имён и автозагрузка являются нормой для Laravel, Symfony, Composer-пакетов и большинства новых 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 полезно хотя бы постепенно выносить повторяющуюся логику в классы и сервисы, не ломая существующую архитектуру.