2011-07-03 51 views
0

當我試圖運行我的網站時,我對靜態和非靜態函數以及類屬性感到困惑。PHP:靜態優於非靜態?

有人可以解釋是否使用靜態函數而不是使用非靜態方法編寫整個網站更好嗎? 我無法在谷歌上找到很多。

+0

我不認爲你應該單獨使用一個或另一個。僅在有意義時才使用靜態,與實例相同 – Ibu

+0

在Google上找不到太多內容,因爲它非常依賴於應用程序的體系結構和(軟件)設計的外觀。 – slhck

+0

你不能只交換靜態和非靜態函數。你的任何類都不需要一個對象實例來存儲狀態嗎? – Dogbert

回答

1

如果你的方法需要訪問「this->」中的數據,那麼你必須使它成爲一種非靜態方法。然後該對象需要實例化(通過「新」)。

如果您的所有方法都使用的是包含在函數參數中的數據,那麼請考慮使您的方法是靜態的。或者僅用靜態方法創建一個單獨的類。

1

這真的取決於你的應用程序的設計。如果該函數可以並且將被調用並且沒有實例化該類,則將其聲明爲靜態。否則,不要。在幾乎所有情況下,你都會使用這兩者的組合,因爲只使用靜態函數是沒有意義的(你也可以編寫程序代碼)。

0

編寫OO代碼並僅使用靜態變量和方法是沒有意義的。這與編寫程序代碼相同。您不能從OOP僅提供靜態代碼的所有功能中受益。

我不是說你不能使用靜態方法或屬性,但是很多時候使用它們是糟糕的OO設計的一個指標。

+0

只使用非靜態方法和屬性是好的嗎? – mkram0

+0

我會說兩者的結合是最好的。例如一些設計模式強烈依賴於靜態功能,例如Singleton。只有在必要時才必須使用靜態代碼。 – Headshota

0

有一個思想流派認爲靜態是有害的,應該避免,因爲它們在過於僵化的類之間創建了綁定。例如。如果你有A和B類,它們調用彼此的方法,然後從他們的子類AA和BB,並期望AA調用BB的代碼,如果他們只知道彼此作爲實例,那麼它將很好地工作,但它會失敗對於仍然指向A/B的靜態呼叫。

無論如何,PHP的靜態實現相當糟糕。在5.3之前沒有遲到的靜態綁定(意思是一個對象不能調用它自己的靜態方法,在一個OOP架構中使得靜態函數無用),靜態函數不能在嚴格模式下非靜態地調用,以錯誤的方式調用函數會導致非常奇怪的錯誤,類與他們的父母分享他們的靜態變量......當不確定時,你應該去與非靜態恕我直言。