PHP中靜態與非靜態那些事情

來源:互聯網
上載者:User
PHP中靜態與非靜態那些事兒

靜態也能調用非靜態方法

廢話少說,直接看代碼:

error_reporting(E_ALL);// 將所有錯誤資訊報出來class Test{    public static function test1()    {        //$this->test2();// 這樣子肯定是報錯的,靜態方法不能使用$this        // 如果非要在這裡調用test2(),可以使用以下方式,稱為方式一        $instance = new Test();        $instance->test2();        // 或者使用更簡單的方式,稱為方式二(PHP會給出調用警告)        self::test2();    }    public function test2()    {        echo 'test static function';    }}Test::test1();

這裡要說明幾點,
1. 方式一這種就是說建立一個對象,然後來調用這個對象的方法,這個不衝突的。
2. 至於方式二為什麼能夠這麼調用非靜態方法,這個請參考鳥哥的一篇文章:PHP的Calling Scope
方式二,產生如下警告:

所有大家在實際的應用中, 大家 盡量要避免 使用”::”來調用一個非靜態方法。

非靜態方法調用靜態方法竟如此多嬌

想想我也是醉了,竟然還能使用$this來調用非靜態方法。且看代碼:

error_reporting(E_ALL);class Test2{    public static function test1()    {        echo 'good test
'; } // 大家可以想象這裡我為什麼不寫test2()這個方法名呢?直接從1蹦躂到了3 public function test3() { self::test1();// 這個可以吧,沒有問題 static::test1();// 這個也不解釋了 $this->test1();// 重點說說它 }}$Obj = new Test2();$Obj->test3();

寫代碼驗證,這種$this竟然能夠調用靜態方法時,著實讓我吃了一驚。仔細想想也是合理的,為什麼合理?
且聽小弟慢慢道來。

大家有沒有這樣調用過代碼:

$obj = new Test2();$obj->test1();

OK,在php中可以使用靜態方式調用非靜態方法,也可以使用非靜態方式調用靜態方法。多公平的一種語言呀,真是愛(che)死(dan)你了!
如果你能夠理解上面這種寫法,相信對於 $this->test1() 應該也能理解了吧, $this 相當於當前調用的對象,可以理解為此處new出來的 $obj 。作為一個對象肯定是可以調用它內部的所有方法吧?不解釋了,說多了都是廢話。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.