Какое значение имеет модификатор `protected` в ООП?

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

Ответ

Модификатор доступа protected означает, что член класса (свойство или метод) доступен внутри самого класса и внутри всех классов-наследников. Это ключевой механизм для реализации принципа наследования, позволяющий скрыть детали реализации от внешнего кода, но оставить их доступными для расширения в дочерних классах.

Пример в PHP:

class DatabaseConnection {
    protected $connection;

    protected function connect() {
        // Логика установки защищенного соединения
        $this->connection = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
    }

    public function __construct() {
        $this->connect(); // Внутренний вызов protected метода
    }
}

class UserRepository extends DatabaseConnection {
    public function getUsers() {
        // Наследник имеет доступ к protected свойству родителя
        $stmt = $this->connection->query('SELECT * FROM users');
        return $stmt->fetchAll();
    }
}

$repo = new UserRepository();
$users = $repo->getUsers(); // Работает
// $repo->connection; // Фатальная ошибка: доступ извне запрещен
// $repo->connect();   // Фатальная ошибка: доступ извне запрещен

Ключевые отличия:

  • private: Доступ только внутри класса, где объявлен. Наследники его не видят.
  • protected: Доступ внутри класса и его наследников. Извне (глобальная область видимости, другие классы) — недоступен.
  • public: Доступ откуда угодно.

protected часто используется для методов-«кирпичиков» внутренней логики (шаблонный метод) или свойств, которые должны быть унаследованы, но не изменяться произвольно извне.