PHP: Когда использовать черты и когда использовать статические методы?

Мои PHP-приложения обычно используют классы для пространства имен. Методы внутри этих классов определяются как статические.

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

Здесь был приведен довольно подробный пример использования регистратора: Черты в PHP - примеры реальных примеров/лучших практик?

Но зачем использовать Trait, если вы также можете использовать статический Logger:: log()? Единственное, что я могу сейчас подумать, - это легкий доступ к $this. Еще один пример, с которым я столкнулся сейчас, - это функция пользователя. Пометить его или статический метод?

Может ли кто-нибудь пролить свет на это?

Ответ 1

Прочитав комментарии по этому вопросу, я отвечу на этот вопрос:

Черты позволяют расширять класс, не входя в иерархию классов. Нет необходимости в чем-то вроде class Book extends Loggable, поскольку сама книга не является Loggable, мы просто хотим использовать функцию Loggable. Функциональность в Loggable может быть заполнена признаком, поэтому она может использовать методы Loggable в книге, как если бы вы расширялись от нее.

Преимущество использования признаков выше использования статических методов в классах (или функций с расширением имен) заключается в том, что этот признак имеет доступ к полному классу, а также к частным членам.

Недостатком использования статических функций вместо признаков является тесная взаимосвязь (зависимости) между классами, что может повредить повторное использование и может повредить модульное тестирование (например, при использовании макетных сервисов). Зависимости должны вводиться во время выполнения, что действительно усиливает попытку создания экземпляра класса/метода, но обеспечивает большую гибкость над полным приложением. Это было новое понимание для меня.

Ответ 2

Черты могут обращаться к частным членам объектов.