Я чувствую, что ключевое слово final является своего рода яблоком раздора в нашем PHP-сообществе. Давайте погрузимся в этот спор и попробуем выяснить, что может быть лучшим выбором.

Что такое финальное ключевое слово?

Когда мы помечаем какой-либо класс как final, мы запрещаем другим классам его расширять. Если вы никогда раньше не использовали эту функцию, вы можете задаться вопросом, почему мы можем захотеть предотвратить наследование. Но прежде чем мы объясним некоторые вещи, давайте узнаем, как не использовать ключевое слово final.

Как не использовать финальное ключевое слово

Мы можем отметить почти каждый класс как final, но есть случаи, когда мы не должны или не можем этого делать. Что это за случаи?

  • Существует по крайней мере один общедоступный метод, не охваченный ни одним из реализованных интерфейсов. Почему? Мы делаем невозможным декорирование таким методом.
  • Ваш класс — это сущность (по крайней мере, сущность Doctrine). Почему? У Doctrine есть проблемы с обработкой сущностей, помеченных как final.

И это все (если вы спросите меня). Все остальные случаи (не считая тех, о которых я забыл) можно решить с помощью ключевого слова final. Итак, почему мы хотим использовать ключевое слово final?

Преимущества использования конечного ключевого слова

Мы можем рассматривать ключевое слово final как карту-ловушку. Вы расширяете класс, и бум, ошибка. Если вы хотите использовать какое-либо поведение из этого класса, создайте новый. Если вы пытаетесь расширить его поведение, используйте шаблон декоратора.

  • Мы форсируем композицию, а не наследование. Почему? Вы не можете расширять = вы вынуждены использовать композицию.
  • Мы форсируем принцип Open-Closed. Почему? Вы можете расширить то, что происходит до или после, но не можете изменить исходное поведение.
  • Мы заставляем разработчика думать о публичном API. Почему? Ключевое слово Final прекрасно работает только с интерфейсами.

Есть недостатки?

Я не уверен, что могу считать это недостатком, но нужно время, чтобы изменить свой образ мышления. В первый раз может быть неестественно составлять новый класс из существующих, а просто расширять другой класс.

Итак, действительно ли мне нужно финальное ключевое слово?

Пока у вас есть интерфейс для каждого общедоступного метода, и вы кодируете, используя передовые методы, начало использования ключевого слова final может быть для вас очевидным изменением. Самое важное — принять это решение на уровне проекта и убедиться, что каждый член команды понимает, почему вы используете ключевое слово final. Вы можете добиться тех же результатов без ключевого слова final, я отношусь к нему больше как к «статическому анализу», чем к функции, без которой я не мог бы жить.

Спасибо за прочтение и до скорой встречи в следующих статьях. Как всегда, напоминаю, что вы можете найти меня здесь:

Твиттер 👉🏼 https://twitter.com/jakub_tobiasz

Мастодонт 👉🏼 https://phpc.social/web/@jakubtobiasz

GitHub 👉🏼 https://github.com/jakubtobiasz