因為某些框架的設計常常會看到
DB::get('mall')->where('aaa');
為什麼不能這麼做
DB::get('mall')::where('aaa ');
還有一些問題就是透過工廠或靜態容器生產的物件一般都是費靜態的。
例如一個日誌的類,我看過靜態的也看過非靜態的設計。有點選擇不定
不要跟我講什麼工具類型的最好是靜態的,不用new之類的廢話。
因為某些框架的設計常常會看到
DB::get('mall')->where('aaa');
為什麼不能這麼做
DB::get('mall')::where('aaa ');
還有一些問題就是透過工廠或靜態容器生產的物件一般都是費靜態的。
例如一個日誌的類,我看過靜態的也看過非靜態的設計。有點選擇不定
不要跟我講什麼工具類型的最好是靜態的,不用new之類的廢話。
首先你要理解靜態和非靜態的差別。
靜態的類,不需要實例化就可以使用。這樣的話會有一點點性能提升。
靜態的屬性,是所有實例都共享的,不管多少實例,靜態屬性只有一個。
當然非靜態類別如果按照單例的方式來使用,事實上差異並不大。
那如何選擇靜態和非靜態呢?根據每個人對物件導向的理解程度,使用方法都不一樣。
比如日誌。如果一個系統只存在一個日誌對象,那麼使用靜態類別無疑是最好的,不管是呼叫方法、效能、資料儲存都比較方便。這時候這個日誌對象,你可以把它當成實體物件也可以當成抽象對象來用。
但是如果把日誌細化成使用者行為日誌、資料庫操作日誌、伺服器狀態日誌等等,這時候再把日誌已經是一個抽象的物件了,它需要有實體才能更好的使用。這時候使用非靜態的,分別 new 出來會好一點。因為雖然他們都是同屬日誌對象,但他們卻有不同的資料、方法。功能。
所以,我個人理解就是,如果一個類別是一個完整的功能模組,不依賴其他模組,也不需要進行擴充就能完成這個模組的功能,那麼寫成靜態的是最好的。
如果一個類別只是一個抽象對象,也依賴其他模組,或者需要進行擴展,或者需要進行繼承等等,那麼還是使用非靜態的比較好
其實就是不符合物件導向的設計原則,其實怎麼寫都行
其次,靜態類別的不易被回收,像php這類的腳本語言,腳本的生命週期一般是腳本執行完畢就結束了,腳本所佔用的記憶體理論上就被回收了,所以使用靜態類別理論上不存在內存回收的問題。但對於java等,靜態類氾濫的化,就不利於回收記憶體了