2013-11-02 22 views
0

我在做一些在PHP的oop,當我只是想知道它是否很好做到這一點? 當我使用$this->functionName(),它工作得很好,我甚至具有自我嘗試::和靜::和他們的工作如我所料:在非靜態函數上使用self ::或static ::是很好的嗎?

自::將使用父方法實現,靜態將使用最後執行的方法如果被覆蓋(後期靜態綁定)。但問題在於它在非靜態函數上使用。這個好嗎?它有什麼缺點?爲什麼我不應該使用它?

回答

1

查看this answer的詳細說明。

一般而言,您可以完成所描述的任務,而PHP允許這樣做。但是請記住,人們習慣於多態和重寫方法,所以如果你的基類允許重寫某種方法,然後使用self來調用它,那將是奇怪的,我不能改變類的行爲,儘管它暴露了它其API爲publicprotected方法。

IMO,它違反了本書的Uncle Ben的Clean Code book中引用的Principle of least astonishment

此外,static$this綁定之間有一些差異,因爲static將始終嘗試引用較窄但不總是適當的作用域中的元素。這種行爲呈現在this example,並在上面的說明,我這裏引用解釋:

在非靜態環境中,稱爲類將是類的對象實例。由於$this->將嘗試從相同範圍調用私有方法,因此使用static::可能會給出不同的結果。另一個區別是static::只能引用靜態屬性。

因此,儘管有可能在一些地方$this適合使用static,該static關鍵字被介紹給使用訪問靜態方法和字段,並用它另一個目的應被視爲混亂。

+0

這並不能完全回答我的問題。 我們可以使用self :: methodName()而不是$ this-> methodName()...但這樣做好嗎?如果我們使用static :: methodName(),將不會出現多態性的問題,因爲它將與$ this-> methodName相同...... 那麼爲什麼不用self ::/static :: vs $ this-> ?? ? – user2707590

+0

請參閱我的編輯,因爲我提供了更多反對靜態方法使用靜態的參數 – fracz

+0

@ user2707590使用錯誤的訪問器不僅會造成混淆,還會生成警告消息! – ComFreek

相關問題