Работали ли вы с объектно-ориентированным программированием (ООП) в PHP?

«Работали ли вы с объектно-ориентированным программированием (ООП) в PHP?» — вопрос из категории ООП, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, ООП — это основа большинства современных PHP-проектов, над которыми я работал, будь то фреймворки вроде Laravel/Symfony или кастомные приложения.

Практический пример из проекта:

<?php

// Абстракция через интерфейс
interface NotificationSenderInterface {
    public function send(string $recipient, string $message): bool;
}

// Инкапсуляция и реализация
class EmailNotificationSender implements NotificationSenderInterface {
    private string $smtpHost;

    public function __construct(string $smtpHost) {
        $this->smtpHost = $smtpHost; // Данные скрыты (инкапсуляция)
    }

    public function send(string $recipient, string $message): bool {
        // Логика отправки email
        return true;
    }
}

// Наследование и полиморфизм
abstract class AbstractLogger {
    abstract public function log(string $level, string $message): void;

    public function info(string $message): void {
        $this->log('INFO', $message); // Общий шаблон
    }
}

class FileLogger extends AbstractLogger {
    public function log(string $level, string $message): void {
        file_put_contents('app.log', "[$level] $messagen", FILE_APPEND);
    }
}

// Использование (полиморфизм)
$notifier = new EmailNotificationSender('smtp.example.com');
$logger = new FileLogger();

$logger->info('Notification service initialized.');
$notifier->send('user@example.com', 'Welcome!');

Из реального опыта:

  • Активно применял трейты (trait) для горизонтального повторного использования кода, например, для добавления поведения SoftDeletes или Timestampable в модели.
  • Использовал магические методы, такие как __get()/__set() для динамических свойств или __invoke() для создания callable-объектов.
  • Следование принципам SOLID (особенно Dependency Injection и Interface Segregation) было ключевым для создания поддерживаемых и тестируемых сервисов в Symfony.