2017-10-20 192 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

相關問題