Ответ
В PHP, чтобы полностью запретить наследование от класса, необходимо объявить его с ключевым словом final. Это делается на уровне объявления самого класса.
Синтаксис:
final class ApiClient {
// Свойства и методы класса
public function fetchData(): array {
// ...
}
}
// Попытка наследования вызовет фатальную ошибку:
// Fatal error: Class ExtendedClient cannot extend final class ApiClient
class ExtendedClient extends ApiClient {} // НЕВОЗМОЖНО
Детали и best practices:
- Запрет на уровне компиляции: Проверка происходит во время разбора кода, а не в runtime. Это исключает любую возможность обхода.
- Применение: Ключевое слово
finalследует использовать для классов, которые реализуют критичную, стабильную логику, и расширение которой может нарушить работу системы. Частые кандидаты — сервис-контейнеры, фасады, важные сервисы бизнес-логики. -
Отдельные final-методы: Вы можете оставить класс открытым для наследования, но запретить переопределение конкретных критичных методов, также пометив их
final.class PaymentProcessor { // Этот метод нельзя переопределить в дочерних классах final public function validateTransaction(Transaction $tx): bool { // Критичная валидация } // Этот метод можно переопределить public function getProviderName(): string { return 'default'; } } - Архитектурный смысл: Использование
finalпо умолчанию — хорошая практика, так как она заставляет явно проектировать для расширения (через композицию или интерфейсы), а не через наследование, что делает код более гибким и соответствующим принципу открытости/закрытости (SOLID).