對象訪問靜態方法
Static關鍵字
聲明類成員或方法為static,就可以不實例化類而直接訪問。不能通過一個對象來訪問其中的靜態成員(靜態方法除外)。
由於靜態方法不需要通過對象即可調用,所以偽變數$this在靜態方法中不可用。
靜態屬性不可以由對象通過->操作符來訪問。
用::方式調用一個非靜態方法會導致一個E_STRICT級別的錯誤。
就像其它所有的PHP靜態變數一樣,靜態屬性只能被初始化為一個字元值或一個常量,不能使用表達式。 所以你可以把靜態屬性初始化為整型或數組,但不能指向另一個變數或函數返回值,也不能指向一個對象。
--------以上為php手冊 原文
不管是靜態方法還是非靜態方法,都需要調用後執行,也就是聲明的時候只是在棧內存中存了一個引用,堆內存中並沒有分配存儲空間,執行的時候才載入到堆內存中...
其執行的次序和在類里聲明的次序無關,區別是靜態方法是「class.method"方式執行,非靜態方法是"object.method"方式執行,即後者需要創建一個對象。
所以就有一個問題,對象是執行的時候才真正載入到內存中去,但是非靜態方法執行後,若不會再使用則會被垃圾回收器回收,釋放內存
而靜態方法載入且只載入一次,所有對象都共用這獨一份,因此會一直放在內存中,消耗內存資源...
⑶ python中靜態變數是怎麼在對象方法中訪問的
Python 是雙面向的,既可以面向函數編程,也可以面向對象編程,所謂面向函數就是單獨一個. py 文件,裡面沒有類,全是一些函數,調用的時候導入模塊,通過模塊名.函數名()即可調用,完全不需要類,那麼你可能會問,那要類還有什麼毛用? 類就是用來面向對象編程啦,類可以有自己的屬性,類可以創建很多實例,每個實例可以有不同的屬性,這也就保存了很多私有的數據,總之都有存在的必要.
再來看上面這張圖,在類裡面定義的函數就是方法,類方法需要@ classmethod 修飾並且有個隱藏參數 cls,實例方法必須有個參數 self, 靜態方法必須有 @staticmethod修飾,類和實例都可以訪問靜態方法,實例可以訪問實例方法也可以訪問類方法,類可以訪問類方法也可以訪問實例方法,訪問實例方法必須要帶參數 self, 可以理解為類其實也是一個實例,類訪問實例方法不帶參數會報錯的.類本身可以訪問函數,實例卻不行.