php 5.3+來自同一類但未實例化的靜態方法的php調用類方法
對不起,我想完整地瞭解這一點。
我知道我無法從靜態方法內部調用一個非靜態的相同類方法,而沒有將該類作爲對象實例化。
class Person
{
private $people_array;
function data_all_get()
{ // touch database, return array of people
$this->people_array = // etc dbquery results
}
static function showPeople()
{ // call class method
$people_data = $this->data_all_get();
// Fatal error: Using $this when not in object context
}
} // end class Person
從SO搜索,我發現了一些有趣的方法,但想知道每種方法如何影響代碼環境。
我的問題是如下:
我可以實例化類的靜態方法內的對象,以獲得對非靜態方法
static function showPeople()
{ // instantiate as object
$person = New Person();
// call class method
$people_data = $this->data_all_get();
}
Q1訪問 - 有什麼問題可以這項事業? 在我的情況下,該類沒有構造函數,所以沒有其他類方法和變量會受到實例的影響。在腳本執行期間,這個新對象會佔用內存中的一小部分空間嗎?似乎不是太糟糕了......
的另一種選擇是將「data_all_get」的方法轉換成一個靜態方法,所以它可以從靜態方法「showPeople」內部調用,即
self::showPeople()
當其實例化爲對象時,其他方法正在使用「data_all_get」方法設置專用變量的值,以減少到數據庫的間隔(如果已設置)。我知道這可能是一個構造函數的一部分,但我從來沒有必要爲每個php腳本請求多次安裝此「Person」對象,該類主要用於組織函數和變量。
Q2 - 將「data_all_get」變成靜態方法的含義是什麼? 有沒有?如果該方法是靜態的,但它設置私有var $ people_array(不是靜態的)的值,我認爲如果對象需要在單個實例中第二次實例化,那麼var就可以被更新或覆蓋腳本請求,正確嗎?另外,因爲該屬性不是靜態的,所以該類的其他方法可以訪問它。
Q3 - 我可以多次調用靜態方法「data_all_get」而無需「破壞任何東西」(一個加載的問題IK)。
Q4 - 每次調用靜態方法時它是否只使用額外的內存?
謝謝
我不明白爲什麼showPeople在這裏列出的是一個靜態函數。你上面粘貼的代碼看起來像非常標準的OO代碼,正如你所提到的,如果你可以只是實例化類,那麼沒有理由靜態運行它。我認爲想想靜態方法的最佳方式就像獨立函數一樣,封裝在類中。 (這對我來說無論如何)。從你所描述的內容來看,只需放下靜態調用,但如果你需要使用它,我認爲你上面粘貼的代碼應該沒問題(實例化類)。 – DaOgre
感謝您的反饋。我使這個方法是靜態的,所以它可以從應用程序的其他區域/路由中調用,而不需要首先實例化一個對象(就像在oop世界中的包含文件)。我做了一些更多的研究和測試,目前我傾向於使成員屬性也是靜態的,而其他需要設置這些屬性的類方法是靜態的,所以這個靜態類可以調用它們。現在正在處理它... –
更新:我重構並使成員屬性爲靜態,並使getter&setter函數爲靜態,以便可以通過靜態成員方法和類方法調用它們,並且它正在工作。但仍然希望您對我上面列出的4個問題有任何意見和建議,謝謝。 –