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