為什麼$this能訪問static的function呢?

來源:互聯網
上載者:User
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方法 ,這是合理的麽?

靜態函數既可以通過類調用,也可以通過執行個體調用。如果 Cpublic 的話,$a->C() 也是可以的。$this 作為對執行個體的引用,自然也可以調用靜態函數。

靜態方法應該可以通過內部訪問吧

合理

第一,從存取權限上可以,C是私人函數,只能在 A類裡面訪問
第二,其實,靜態函數屬於整個類,可以訪問

存取權限的問題只是為了讓我們的代碼更不容易出錯,不是為了讓我們更不方便寫代碼,如果用機器碼寫代碼,隨便敲幾個符號進去,都可以運行,但是運行結果麼,就不好說了,所以進階語言用文法來限制你,盡量的不讓你出錯。這樣你隨便敲幾行代碼的程式是不一定能編譯的。

對於非靜態函數,這個函數一般要基於某個對象運行(要訪問對象中的某個非靜態變數),類只是提供了建立對象的模板,實際中並不會分配空間,一般的函數需要方便對象中的變數,那麼就需要基於對象運行,對象才是佔用真正的記憶體空間。靜態函數是基於這個類的,也就是說他被規定為不能訪問對象中的變數(屬性),所以他的運行不需要基於對象,只需要基於類就可以了。
剛才說過了,文法不是為了讓我們更不方便寫代碼,所以對於靜態函數(如果有許可權的話)可以通過類訪問或是通過類的對象訪問(A::C() $a = new A;$a->C()) ,$this 就是這個類的一個對象,所以可以訪問。

靜態方法可以用$this->C()self::C()static::C()三種方式訪問到,靜態方法仍然是該類的方法啊,所以$this->C()很合理啊,但是靜態方法內不能使用$this,靜態方法在讀到這個類或者引入這個類檔案的時候,就已經執行個體化並存放到記憶體中了,非靜態類則需要new一下。靜態類在記憶體中即使有多個執行個體,靜態屬性也只有一份,也就是無論是哪一個執行個體的C()方法指向的是記憶體中的同一塊地址啊。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.