2017-10-20 108 views
3

我在一个专有项目上工作,这个项目使用了很多这种或那种形式的工厂。他们中的大多数不会按名称实例化类,但是,是否使用new self()new static()来实例化取决于开发人员。我应该使用新的自我还是新的静态?

我意识到了这种差异,但是我很好奇,如果对于哪一种方法是“正确”的方式去解决迟滞静态绑定在技术上没有要求的话,我很好奇。例如,new static()经常在服务类中找到,几乎肯定不会被分类。这在抽象类中显然很重要,但是我的偏好是使用new self(),我不希望子类。

,解决技术问题的区别:

我很好奇:

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

对于问题1(是否有性能问题),请通过将其安装1M次或类似的方法来对您的某些实际类别进行基准测试。 –

回答

4

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

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

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

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

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

请注意,这个问题其实很类似于这里:Is it possible to overuse late static binding in PHP?。你可能会发现这个答案也很有用。

+1

你可以随时[最终宣布一个班级](https://secure.php.net/manual/en/language.oop5.final.php)。 – Mikkel

+0

您是正确的先生,现在编辑我的答案。 – MSC

相关问题