Что такое инкапсуляция в ООП?

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

Ответ

Инкапсуляция — это один из четырёх основных принципов объектно-ориентированного программирования. Его суть заключается в объединении данных (полей) и методов, которые с этими данными работают, в единую структуру — класс. При этом внутреннее состояние объекта скрывается от внешнего кода, а доступ к нему предоставляется через строго определённый публичный интерфейс.

Ключевые аспекты инкапсуляции:

  1. Сокрытие реализации (Data Hiding). Внутренние поля класса объявляются как private или protected. Это защищает объект от неконтролируемого и некорректного изменения извне.
  2. Предоставление публичного интерфейса. Для работы с приватными данными создаются публичные методы — геттеры (getters) для чтения и сеттеры (setters) для записи. Это позволяет валидировать данные и выполнять дополнительную логику при изменении состояния.

Пример на PHP:

class BankAccount {
    // Приватное поле, скрытое от внешнего мира
    private float $balance = 0.0;

    // Публичный метод — часть интерфейса для работы с балансом
    public function deposit(float $amount): void {
        if ($amount > 0) {
            $this->balance += $amount;
        } else {
            throw new InvalidArgumentException('Deposit amount must be positive');
        }
    }

    public function withdraw(float $amount): void {
        if ($amount > 0 && $amount <= $this->balance) {
            $this->balance -= $amount;
        } else {
            throw new InvalidArgumentException('Invalid withdrawal amount');
        }
    }

    // Геттер для получения текущего баланса
    public function getBalance(): float {
        return $this->balance;
    }
}

// Использование
$account = new BankAccount();
$account->deposit(100.0); // Корректное изменение состояния
// $account->balance = -500; // Ошибка! Поле private, напрямую изменить нельзя.
echo $account->getBalance(); // 100

Преимущества инкапсуляции:

  • Защита целостности данных: Предотвращает попадание объекта в недопустимое состояние.
  • Упрощение поддержки и рефакторинга: Можно менять внутреннюю реализацию класса, не ломая код, который его использует, если публичный интерфейс остаётся прежним.
  • Улучшение читаемости: Чётко видно, как предполагается взаимодействовать с объектом.

Видео-ответы