資源描述:
《靜態(tài)方式調(diào)用非靜態(tài)方法》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、靜態(tài)方式調(diào)用非靜態(tài)方法php是個(gè)很詭異的語言。當(dāng)然,這是對(duì)學(xué)習(xí)過C++或者Java等面向?qū)ο笳Z言的人來說。php可以定義靜態(tài)的方法,然后通過className::staticMethod()形式來調(diào)用。非靜態(tài)的方法,當(dāng)然通過classObject->nonStaticMethod()使用。這個(gè)其他語言中也是如此,沒什么大驚小怪的??墒?,您能用className::nonStaticMethod()調(diào)用非靜態(tài)方法嗎?這方面恐怕Java和C++要冷汗直流了。其實(shí),php自己也是滿臉黑線。為什么這么說呢?先來看看面向?qū)ο蟮撵o態(tài)和非靜態(tài)。面向?qū)ο蟮恼Z言中,都會(huì)支持靜態(tài)方法。靜態(tài)方法,屬于類
2、的固定資產(chǎn)的;非靜態(tài)的方法,屬于類的實(shí)例的私有財(cái)產(chǎn)。在內(nèi)存中,靜態(tài)方法,對(duì)于整個(gè)類也就只存了這么一份;無論你new了多少個(gè)實(shí)例對(duì)象,它們共用的也就這么一份。對(duì)于非靜態(tài)的就不一樣了,你new幾個(gè),內(nèi)存就給你new幾份。另外,靜態(tài)方法內(nèi)不可以調(diào)用非靜態(tài)方法,非靜態(tài)方法內(nèi)卻可以調(diào)用靜態(tài)方法。這個(gè)就是靜態(tài)和非靜態(tài)的區(qū)別。面向?qū)ο笥胹tatic關(guān)鍵字來定義靜態(tài)。未被標(biāo)明是靜態(tài)的方法,是不可以用類名加兩個(gè)冒號(hào)的形式調(diào)用的。php和其它很有區(qū)別的一點(diǎn)就是這個(gè)了:php中未被標(biāo)明是靜態(tài)的方法,也可以用類名加兩個(gè)冒號(hào)的形式調(diào)用。那么為什么php有這種語法?又為什么感到很無奈呢?-----以下說明ph
3、p無奈的故事?lián)嚓P(guān)資料改編,已經(jīng)過演義處理--------php之所以發(fā)展如此迅速,得益于它的速度。作為腳本語言,php追求高速度和簡(jiǎn)潔方便,所以選擇了解釋執(zhí)行和使用過程方法。后來為了與國(guó)際接軌,引入了面向?qū)ο蟮母拍?。而就是在引入這個(gè)面向?qū)ο蟮奶卣鲿r(shí),發(fā)生了一件令php目瞪口呆,最終無可奈何的事情。面向?qū)ο笥袀€(gè)很重要的概念就是繼承。在繼承中,子類如果覆蓋父類的方法,同時(shí)需要調(diào)用父類的同名方法,該怎么辦呢?php4版本提供了這樣一種方法:parentClassName::method()。提出此種方法之時(shí),有識(shí)之士已經(jīng)發(fā)現(xiàn)了問題:這個(gè)調(diào)用方式,不正是靜態(tài)方法的調(diào)用方式嗎?php4隨即
4、答曰:不礙事。類中使用時(shí),可以判斷此方式為子類正在調(diào)用父類方法;非類中使用時(shí),就判斷為靜態(tài)調(diào)用了。所需要的只是發(fā)現(xiàn)此種調(diào)用時(shí)查詢一下方法映射就好了。其實(shí),一想,也確實(shí)是那么回事。php4后來想想,如果每次調(diào)用都檢驗(yàn)一下此次調(diào)用是否合法,那多少也會(huì)影響性能,不如這個(gè)問題就交給程序員去控制吧:他們會(huì)知道只在類中使用此形式的調(diào)用的。唉,可惜天不遂人愿。php4低估了程序員們的創(chuàng)造力!程序員們很快發(fā)現(xiàn)了這個(gè)方式,并且不余遺力地使用起來。許多集成的API也開始使用這種怪癖的方式。php無奈了,隨即在php5中引入了另一種方式,使用關(guān)鍵字parent來調(diào)用父類函數(shù):parent::method
5、()。但是,想要放棄php的非靜態(tài)方法的靜態(tài)調(diào)用,著實(shí)是不再可能了。--------------------------------------------------------不過,話說回來,這種php的怪癖方式,有什么好處嗎?性能和內(nèi)存占用方面如何呢?于是我開始推理了:定義了一個(gè)非靜態(tài)的方法,靜態(tài)調(diào)用時(shí),php首先轉(zhuǎn)換此方法為靜態(tài)定義,加載入靜態(tài)內(nèi)存區(qū)域,然后執(zhí)行。通常一次業(yè)務(wù),只使用一個(gè)業(yè)務(wù)處理類中的一個(gè)方法,如果使用非靜態(tài)定義,靜態(tài)調(diào)用,內(nèi)存中豈不是只加載了這個(gè)業(yè)務(wù)類中的一個(gè)方法,不是就實(shí)現(xiàn)了靜態(tài)方法的按需加載嗎?豈不是要省下一部分內(nèi)存?性能方面,無論是靜態(tài)調(diào)用,還是對(duì)象
6、調(diào)用,反正都是執(zhí)行一個(gè)方法,性能還不是一樣?并且靜態(tài)調(diào)用非靜態(tài)定義方法還省了一個(gè)new語句。嗯,嗯。這么想的同時(shí),手就開始寫上了。那么實(shí)際如何呢?我做了一個(gè)小測(cè)試。PHPcodet::start();t::end();//消除t類首次加載的影響t::start();model_profile_base::getBaseInfo($uid);t::end();t::start();$model=newmodel_profile_base();$model->getBaseInfo($uid);t::end();model_profile_base是處理基本資料的一個(gè)業(yè)務(wù)類,比較復(fù)雜,
7、比較接近于項(xiàng)目中的業(yè)務(wù)處理實(shí)際。下面是用到的計(jì)時(shí)和統(tǒng)計(jì)內(nèi)存的t類的定義:PHPcode