1.首先來澄清一些觀點
由於靜態方法在內存中只有一份,無論你調用多少次,都是共用的,而且沒有對象的概念,所以不能在靜態方法里面使用$this調用,如果非得調用的話,只能實例化自身類
而實例化不一樣,每一個實例化是一個對象,在內存中是多個的
<?php Error_reporting(E_ALL|E_STRICT); class A{ public function bar(){ echo 'bar'.PHP_EOL; } public static function foo(){ echo 'foo'.PHP_EOL; } } A::bar();//會報錯 A::foo();//正確
$obj = new A();
$obj -> foo();//正確
/*
bar()是一個非靜態方法,應該由對象來調用,但用靜態來調用此方法也可以執行,而嚴格狀態下,此方法會執行,同時報錯,
Strict Standards: Non-static method Human::easyeat() should not be called statically in........
但是實例化的類是可以調用靜態方法的。
*/
<?php class A{ public $name = 'zongshuai'; public function bar(){ echo 'bar'.PHP_EOL; } public static function foo(){ echo self::$name.PHP_EOL;//報錯 } } A::foo(); /* 靜態方法不能調用非靜態屬性 。不能使用self::調用非靜態屬性。 */
總結:
類》訪問->靜態方法(類的方法)->可以
類》訪問->普通方法(對象的方法)->不可以(雖然方法里不用$this關鍵字時,可以!但不支持這種寫法)
對象》訪問》靜態方法(類的方法)->可以
對象》訪問》普通方法(對象的方法)->可以
