class A{ public function B(){ $this->C(); } private static function C(){ print "Hello world"; }}$a=new A;$a->B();//Hello world
忽然發現,在B中,$this能訪問到static的C方法 ,這是合理的麽?
回複內容:
class A{ public function B(){ $this->C(); } private static function C(){ print "Hello world"; }}$a=new A;$a->B();//Hello world
忽然發現,在B中,$this能訪問到static的C方法 ,這是合理的麽?
靜態函數既可以通過類調用,也可以通過執行個體調用。如果 C
是 public
的話,$a->C()
也是可以的。$this
作為對執行個體的引用,自然也可以調用靜態函數。
靜態方法應該可以通過內部訪問吧
合理
第一,從存取權限上可以,C是私人函數,只能在 A類裡面訪問
第二,其實,靜態函數屬於整個類,可以訪問
存取權限的問題只是為了讓我們的代碼更不容易出錯,不是為了讓我們更不方便寫代碼,如果用機器碼寫代碼,隨便敲幾個符號進去,都可以運行,但是運行結果麼,就不好說了,所以進階語言用文法來限制你,盡量的不讓你出錯。這樣你隨便敲幾行代碼的程式是不一定能編譯的。
對於非靜態函數,這個函數一般要基於某個對象運行(要訪問對象中的某個非靜態變數),類只是提供了建立對象的模板,實際中並不會分配空間,一般的函數需要方便對象中的變數,那麼就需要基於對象運行,對象才是佔用真正的記憶體空間。靜態函數是基於這個類的,也就是說他被規定為不能訪問對象中的變數(屬性),所以他的運行不需要基於對象,只需要基於類就可以了。
剛才說過了,文法不是為了讓我們更不方便寫代碼,所以對於靜態函數(如果有許可權的話)可以通過類訪問或是通過類的對象訪問(A::C()
$a = new A;$a->C()
) ,$this
就是這個類的一個對象,所以可以訪問。
靜態方法可以用$this->C()
,self::C()
,static::C()
三種方式訪問到,靜態方法仍然是該類的方法啊,所以$this->C()
很合理啊,但是靜態方法內不能使用$this
,靜態方法在讀到這個類或者引入這個類檔案的時候,就已經執行個體化並存放到記憶體中了,非靜態類則需要new一下。靜態類在記憶體中即使有多個執行個體,靜態屬性也只有一份,也就是無論是哪一個執行個體的C()
方法指向的是記憶體中的同一塊地址啊。