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

Mik*_*kel 5 php late-static-binding psr-2

我从事一个专有项目,该项目使用了很多种形式的工厂.他们中的大多数不通过名称实例化类,幸运的是,但是否new self()还是new static()用于实例取决于开发商变化.

我知道不同之处,但我很好奇是否有一些共识,即当技术上不需要后期静态绑定时哪一个是"正确"的方法.例如,new static()经常在服务类中找到几乎肯定永远不会被子类化的服务类.它在抽象类中显然很重要,但我的偏好是使用new self()我不期望子类的地方.

解决技术差异的问题:

我很好奇:

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

MSC*_*MSC 7

首先,让我们讨论一下这个差异:

回到新的静态将导致派生类的一个实例,这意味着如果符声明静态方法创建()(工厂方法)返回new static,然后调用Foo::Create()self::Create()从富将返回美孚的一个实例.但是,如果class Bar extends Foo和你打电话Bar::Create(),它将返回一个Bar实例.

因此,如果要Bar::Create()返回Foo的实例,则应使用new self,而不是new static.

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

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

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