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 。作為一個對象肯定是可以調用它內部的所有方法吧?不解釋了,說多了都是廢話。