Для чего нужны модификаторы видимости в ООП?

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

Ответ

Модификаторы видимости (public, protected, private) реализуют принцип инкапсуляции — сокрытия внутреннего состояния объекта и деталей реализации от внешнего мира.

Цели:

  1. Защита инвариантов объекта: Предотвращение попадания объекта в неконсистентное состояние извне.
  2. Упрощение интерфейса: Пользователю класса предоставляется только контракт (public методы), скрывая сложную внутреннюю кухню.
  3. Гибкость для изменений: Внутреннюю реализацию (private/protected поля и методы) можно менять, не ломая код, который зависит только от public интерфейса.

Пример на Java/C#-подобном синтаксисе:

class BankAccount {
    // private: Только этот класс имеет прямой доступ.
    // Запрещено менять баланс в обход методов.
    private double balance;
    private String accountNumber;

    // protected: Доступ для этого класса и наследников.
    protected String currency = "USD";

    // public: Интерфейс для внешнего мира.
    public BankAccount(String number, double initialDeposit) {
        this.accountNumber = number;
        this.balance = initialDeposit;
    }

    public void deposit(double amount) {
        if (amount > 0) {
            balance += amount; // Внутренний доступ разрешён
            logTransaction("DEPOSIT", amount);
        }
    }

    public double getBalance() {
        return balance; // Возвращаем копию или значение, но не ссылку на поле
    }

    // private метод: вспомогательная логика, скрытая отвне.
    private void logTransaction(String type, double amount) {
        // Запись в лог...
    }
}

// Использование:
BankAccount acc = new BankAccount("12345", 100.0);
acc.deposit(50.0); // OK
// acc.balance = 1000000; // ОШИБКА КОМПИЛЯЦИИ: поле private
// acc.logTransaction(...); // ОШИБКА: метод private
double currentBalance = acc.getBalance(); // OK, публичный геттер