gpt4 book ai didi

php - 我应该使用 new self 还是 new static?

转载 作者:可可西里 更新时间:2023-11-01 13:52:15 28 4
gpt4 key购买 nike

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

我知道其中的区别,但我很好奇在技术上不需要后期静态绑定(bind)时,是否就哪一种是“正确”方式达成共识。例如,new static() 经常出现在几乎肯定永远不会被子类化的服务类中。这在抽象类中显然很重要,但我更喜欢在不需要子类的地方使用 new self()

解决技术差异的问题:

我好奇的是:

  • 使用后期静态绑定(bind)是否会影响性能?
  • 采用一种做法是否会对代码维护产生影响?例如。如果我使用 new self() 子类化一个类,我必须覆盖/更改所有此类情况,但如果我的构造函数发生更改,这也许不是一件坏事。
  • 是否有这方面的最佳实践记录?我们使用 PSR-2,至少是出于理想,但我不认为它涵盖了这一点。

最佳答案

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

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

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

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

就性能而言;鉴于 PHP 是解释性的,我无法想象它会对性能产生重大影响。这实际上是关于什么更正确/语义的讨论,重申一下,我认为大多数时候返回一个新的静态是正确的答案,在特定情况下返回一个新的 self 是异常(exception)。

请注意,这个问题实际上与此处非常相似:Is it possible to overuse late static binding in PHP? .您可能会发现该答案也很有用。

关于php - 我应该使用 new self 还是 new static?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46849805/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com