不同點有:1、靜態(tài)方法在程序開始時生成內(nèi)存,實例方法在程序運行中生成內(nèi)存;2、靜態(tài)方法可以直接調(diào)用,實例方法要先成生實例,通過實例調(diào)用方法;3、靜態(tài)的內(nèi)存是連續(xù)的,實例申請的是離散的空間,所以沒有靜態(tài)方法快,靜態(tài)內(nèi)存是有限制的。
靜態(tài)方法只有一個,無論你調(diào)用多少次,都是共用的,是沒有對象的概念,因此不能在靜態(tài)方法里面使用$this調(diào)用,如果非得調(diào)用的話,只能實例化自身類
實例化不一樣,每一個實例化是一個對象,擁有多個。
下面用一個實例來了解一下
<?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()是一個非靜態(tài)方法,應(yīng)該由對象來調(diào)用,但用靜態(tài)來調(diào)用此方法也可以執(zhí)行,而嚴格狀態(tài)下,此方法會執(zhí)行,同時報錯, Strict Standards: Non-static method Human::easyeat() should not be called statically in........ 但是實例化的類是可以調(diào)用靜態(tài)方法的。 */
<?php class A{ public $name = 'kangbazi'; public function bar(){ echo 'bar'.PHP_EOL; } public static function foo(){ echo self::$name.PHP_EOL;//報錯 } } A::foo(); /* 靜態(tài)方法不能調(diào)用非靜態(tài)屬性 。不能使用self::調(diào)用非靜態(tài)屬性。 */
做一個小總結(jié):
最大的區(qū)別在于內(nèi)存。
靜態(tài)方法在程序開始時生成內(nèi)存,實例方法在程序運行中生成內(nèi)存,
所以靜態(tài)方法可以直接調(diào)用,實例方法要先成生實例,通過實例調(diào)用方法,靜態(tài)速度很快,但是多了會占內(nèi)存。
任何語言都是對內(nèi)存和磁盤的操作,至于是否面向?qū)ο?只是軟件層的問題,底層都是一樣的,只是實現(xiàn)方法不同。
靜態(tài)內(nèi)存是連續(xù)的,因為是在程序開始時就生成了,而實例申請的是離散的空間,所以當(dāng)然沒有靜態(tài)方法快,
而且靜態(tài)內(nèi)存是有限制的,太多了程序會啟動不了。
推薦教程:《php教程》