Должен ли я использовать новый себя или новую статику?

Я работаю над собственным проектом, который использует довольно много фабрик той или иной формы. К счастью, большинство из них не создают экземпляр класса по имени, но new self() или же new static() используется для создания экземпляров варьируется в зависимости от разработчика.

Я осознаю разницу, но мне любопытно, есть ли какой-то консенсус по поводу того, какой из них является «правильным», если позднее статическое связывание технически не требуется. Например, new static() часто встречается в классах обслуживания, которые почти наверняка никогда не будут разделены на подклассы. Это очевидно важно в абстрактных классах, но я бы предпочел использовать new self() где я не ожидаю подкласса.

Вопросы, касающиеся технической разницы:

Что мне интересно:

  • Есть ли снижение производительности при использовании позднего статического связывания?
  • Есть ли какие-либо последствия для поддержки кода при принятии одной практики? Например. Если я подкласс класса, используя new self()Я должен переопределить / изменить все такие случаи, но, может быть, это не плохо, если мой конструктор изменится.
  • Есть ли задокументированная лучшая практика по этому вопросу? Мы используем PSR-2, по крайней мере, аспирационно, но я не думаю, что это покрывает это.

5

Решение

Во-первых, давайте на минутку обсудим разницу:

Возврат новой статики приведет к экземпляру производного класса, то есть, если Foo объявит статический метод Create () (фабричный метод), который возвращает new staticпотом звоню Foo::Create() или же self::Create() из Foo вернет экземпляр Foo. Однако если class Bar extends Fooи ты звонишь Bar::Create(), он вернет экземпляр Бар.

Таким образом, если вы хотите Bar::Create() чтобы вернуть экземпляр Foo, вы должны использовать новый self, а не new static.

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

Насколько производительность идет; учитывая, что PHP интерпретируется, я не могу себе представить, что он имеет существенное влияние на производительность. Это действительно дискуссия о том, что является более правильным / семантическим, и, повторюсь, я думаю, что возвращение новой статики является правильным ответом в большинстве случаев, а возвращение нового «я» является исключением в определенных обстоятельствах.

Обратите внимание, что этот вопрос на самом деле очень похож на здесь: Возможно ли злоупотреблять поздним статическим связыванием в PHP?. Вы также можете найти этот ответ полезным.

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]