我应该使用新的自我还是新的静态?

我在一个专有项目上工作,这个项目使用了很多这种或那种形式的工厂。 他们中的大多数并没有通过名称实例化类,幸运的是, new self()new static()是否用于实例化取决于开发人员。

我意识到不同之处,但我很好奇,如果在技术上不需要后期静态绑定时,哪一种方法是“正确”的方式,那么我们是否有共识。 例如, new static()常常在服务类中找到,几乎肯定不会被子类化。 这在抽象类中显然很重要,但我的偏好是在不期望子类的情况下使用new self()

解决技术差异的问题:

  • 新的自我与新的静态
  • 什么意思是新的静态?
  • 为什么返回新的静态? (PHP)
  • 我很好奇的是:

  • 使用晚期静态绑定会有性能下降吗?
  • 采用一种做法是否会影响代码维护? 例如。 如果我使用new self()来继承一个类,我必须重写/更改所有这些情况,但如果我的构造函数更改,这可能不是一件坏事。
  • 有没有记录在此最佳做法? 我们至少在理想情况下使用PSR-2,但我不认为它涵盖了这一点。

  • 首先,我们来讨论一下差异:

    返回新的静态将产生一个派生类的实例,这意味着如果Foo声明返回一个new static静态方法Create()(一个工厂方法),然后从Foo调用Foo::Create()self::Create()将返回Foo的一个实例。 但是,如果class Bar extends Foo ,并调用Bar::Create() ,它将返回Bar的一个实例。

    因此,如果你想让Bar::Create()返回一个Foo的实例,你应该使用新的自己,而不是新的静态。

    考虑到开发人员对静态工厂方法(如Create())返回派生类实例的期望,我认为在大多数情况下返回迟到类型可能是正确的答案。 然而,如果一个班级被标记为final (封闭,关闭延期),那么这并不重要。 假设一个类不是最终的,(假设其他人可以扩展它),静态可能是正确的选择。

    就表现而言, 鉴于PHP的解释,我无法想象它有重大的性能影响。 这实际上是关于什么是更正确/语义的讨论,并且重申,我认为在大多数情况下返回新的静态是正确的答案,在特定情况下返回新的自我是例外。

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

    链接地址: http://www.djcxy.com/p/58059.html

    上一篇: Should I use new self or new static?

    下一篇: Why return new static? (PHP)