Я работаю над собственным проектом, который использует довольно много фабрик той или иной формы. К счастью, большинство из них не создают экземпляр класса по имени, но new self()
или же new static()
используется для создания экземпляров варьируется в зависимости от разработчика.
Я осознаю разницу, но мне любопытно, есть ли какой-то консенсус по поводу того, какой из них является «правильным», если позднее статическое связывание технически не требуется. Например, new static()
часто встречается в классах обслуживания, которые почти наверняка никогда не будут разделены на подклассы. Это очевидно важно в абстрактных классах, но я бы предпочел использовать new self()
где я не ожидаю подкласса.
Вопросы, касающиеся технической разницы:
Что мне интересно:
new self()
Я должен переопределить / изменить все такие случаи, но, может быть, это не плохо, если мой конструктор изменится.Во-первых, давайте на минутку обсудим разницу:
Возврат новой статики приведет к экземпляру производного класса, то есть, если 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?. Вы также можете найти этот ответ полезным.
Других решений пока нет …