В чем разница между модификаторами private и final в PHP?

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

Ответ

Модификаторы private и final решают разные задачи в объектно-ориентированном программировании на PHP.

private — это модификатор доступа (visibility). Он ограничивает область видимости свойства или метода только классом, в котором они объявлены.

  • Не наследуется.
  • Недоступен из дочерних классов и извне.
  • Используется для инкапсуляции внутренней логики класса.

Пример с private:

class DatabaseConnection {
    private $connection;

    private function connect() {
        // Внутренний метод, нельзя вызвать извне или из наследника
        $this->connection = new PDO(...);
    }

    public function query($sql) {
        $this->connect(); // Можно вызвать только внутри этого класса
        return $this->connection->query($sql);
    }
}

$db = new DatabaseConnection();
// $db->connection; // Фатальная ошибка: Cannot access private property
// $db->connect();   // Фатальная ошибка: Call to private method

final — это модификатор наследования/переопределения. Он запрещает дальнейшее наследование класса или переопределение метода в дочерних классах.

  • Не влияет на область видимости (метод/класс может быть final public).
  • Применяется к классам или методам.
  • Используется для защиты критической логики от изменений или для проектирования через композицию.

Пример с final:

final class StringUtils { // Этот класс нельзя унаследовать
    public static function slugify($string) { /* ... */ }
}

// class ExtendedStringUtils extends StringUtils {} // Фатальная ошибка

class PaymentGateway {
    final public function process() { // Этот метод нельзя переопределить
        // Критичная бизнес-логика оплаты
    }
}

class CustomGateway extends PaymentGateway {
    // public function process() {} // Фатальная ошибка: Cannot override final method
}

Итог: private контролирует кто может видеть и использовать член класса, а final контролирует можно ли его изменить через наследование.