我在做一些在PHP的oop,當我只是想知道它是否很好做到這一點? 當我使用$this->functionName()
,它工作得很好,我甚至具有自我嘗試::和靜::和他們的工作如我所料:在非靜態函數上使用self ::或static ::是很好的嗎?
自::將使用父方法實現,靜態將使用最後執行的方法如果被覆蓋(後期靜態綁定)。但問題在於它在非靜態函數上使用。這個好嗎?它有什麼缺點?爲什麼我不應該使用它?
我在做一些在PHP的oop,當我只是想知道它是否很好做到這一點? 當我使用$this->functionName()
,它工作得很好,我甚至具有自我嘗試::和靜::和他們的工作如我所料:在非靜態函數上使用self ::或static ::是很好的嗎?
自::將使用父方法實現,靜態將使用最後執行的方法如果被覆蓋(後期靜態綁定)。但問題在於它在非靜態函數上使用。這個好嗎?它有什麼缺點?爲什麼我不應該使用它?
查看this answer的詳細說明。
一般而言,您可以完成所描述的任務,而PHP允許這樣做。但是請記住,人們習慣於多態和重寫方法,所以如果你的基類允許重寫某種方法,然後使用self
來調用它,那將是奇怪的,我不能改變類的行爲,儘管它暴露了它其API爲public
或protected
方法。
IMO,它違反了本書的Uncle Ben的Clean Code book中引用的Principle of least astonishment。
此外,static
和$this
綁定之間有一些差異,因爲static
將始終嘗試引用較窄但不總是適當的作用域中的元素。這種行爲呈現在this example,並在上面的說明,我這裏引用解釋:
在非靜態環境中,稱爲類將是類的對象實例。由於
$this->
將嘗試從相同範圍調用私有方法,因此使用static::
可能會給出不同的結果。另一個區別是static::
只能引用靜態屬性。
因此,儘管有可能在一些地方$this
適合使用static
,該static
關鍵字被介紹給使用訪問靜態方法和字段,並用它另一個目的應被視爲混亂。
這並不能完全回答我的問題。 我們可以使用self :: methodName()而不是$ this-> methodName()...但這樣做好嗎?如果我們使用static :: methodName(),將不會出現多態性的問題,因爲它將與$ this-> methodName相同...... 那麼爲什麼不用self ::/static :: vs $ this-> ?? ? – user2707590
請參閱我的編輯,因爲我提供了更多反對靜態方法使用靜態的參數 – fracz
@ user2707590使用錯誤的訪問器不僅會造成混淆,還會生成警告消息! – ComFreek