关于php:我应该使用新的自我还是新的静态?

Should I use new self or new static?

我从事的是一个专有项目,它使用了许多不同形式的工厂。幸运的是,它们中的大多数并不按名称实例化类,但是使用new self()new static()进行实例化的方式取决于开发人员。

我知道两者之间的区别,但我很好奇,在技术上不需要后期静态绑定的情况下,是否有一些共识认为哪一种方法是"正确"的。例如,new static()通常出现在服务类中,几乎肯定不会被子类化。这在抽象类中显然很重要,但我的首选是在不需要子类的地方使用new self()

解决技术差异的问题:

  • 新自我与新静态
  • 什么是新静态?
  • 为什么要返回新的静态?(PHP)

我好奇的是:

  • 使用后期静态绑定会影响性能吗?
  • 采用一种实践是否会影响代码维护?如果我使用new self()对一个类进行子类化,我必须重写/更改所有这些情况,但如果我的构造函数更改,这可能不是一件坏事。
  • 是否有记录在案的最佳实践?我们使用PSR-2,至少是有抱负的,但我不认为它涵盖了这一点。


首先,让我们讨论一下区别:

返回新的static将导致派生类的实例,这意味着如果foo声明静态方法create()(工厂方法)返回new static,那么从foo调用Foo::Create()self::Create()将返回foo的实例。但是,如果class Bar extends Foo和您调用Bar::Create()的话,它将返回bar的一个实例。

因此,如果希望Bar::Create()返回foo的实例,则应该使用新的self,而不是新的static。

考虑到开发人员对静态工厂方法(如create()返回派生类的实例)的期望,我认为在大多数情况下返回后期绑定类型可能是正确的答案。但是,如果一个类被标记为final(密封,不允许扩展),那么它就不重要了。假设一个类不是最终的(假定其他类可以扩展它),静态可能是正确的选择。

就性能而言,考虑到PHP的解释,我无法想象它具有显著的性能影响。这实际上是一个关于什么更正确/语义的讨论,重申一下,我认为大多数时候返回一个新的静态状态是正确的答案,返回一个新的自我是特定情况下的例外。

请注意,这个问题实际上与这里非常相似:是否可能在PHP中过度使用后期静态绑定?你可能会发现这个答案也很有用。