В чем разница между модификаторами доступа `private` и `protected`?

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

Ответ

Модификаторы private и protected определяют область видимости свойств и методов класса в объектно-ориентированном программировании.

  • private (закрытый): Член класса доступен только внутри того класса, где он объявлен. Наследники и внешний код не имеют к нему доступа.
  • protected (защищенный): Член класса доступен внутри класса, где он объявлен, и внутри всех классов-наследников. Внешний код доступа не имеет.

Наглядный пример на PHP:

class BankAccount {
    private $balance = 0;      // Только этот класс знает о балансе
    protected $accountNumber; // Номер счета доступен наследникам

    public function __construct($number) {
        $this->accountNumber = $number;
    }

    private function logTransaction() {
        // Внутренний метод, нельзя вызвать извне или из наследника
        echo "Transaction logged internally.n";
    }

    protected function isValidAmount($amount) {
        // Метод для проверки, доступен наследникам
        return $amount > 0;
    }

    public function deposit($amount) {
        if ($this->isValidAmount($amount)) {
            $this->balance += $amount;
            $this->logTransaction();
        }
    }
}

class SavingsAccount extends BankAccount {
    private $interestRate = 0.05;

    public function addInterest() {
        // Можем использовать protected метод родителя
        if ($this->isValidAmount($this->interestRate)) {
            // НЕЛЬЗЯ обратиться к $this->balance (private)
            // Но можно обратиться к $this->accountNumber (protected)
            echo "Adding interest to account #{$this->accountNumber}n";
        }
    }
}

$account = new SavingsAccount('ACC123');
$account->deposit(100); // Работает
// $account->balance = 1000; // Фатальная ошибка: private
// $account->isValidAmount(50); // Фатальная ошибка: protected
$account->addInterest(); // Работает

Когда что использовать:

  • private: Для внутренней реализации класса, деталей, которые не должны «просачиваться» наружу и не относятся к публичному API класса или его наследников (инкапсуляция).
  • protected: Для создания интерфейса для наследников. Вы предоставляете им инструменты для расширения функциональности, скрывая эти детали от внешнего мира.