PHP實(shí)現(xiàn)懶加載的方法
本文實(shí)例講述了PHP實(shí)現(xiàn)懶加載的方法。分享給大家供大家參考。具體分析如下:
尋常php的加載是通過(guò)include(),require()等方法來(lái)加載外部文件,之后再通過(guò)實(shí)例調(diào)用方法或直接調(diào)用靜態(tài)方法,而這樣子寫(xiě)引入語(yǔ)句實(shí)在很麻煩,有的框架會(huì)將特定路徑的文件全部引入,直接實(shí)例化就能使用,但這樣一來(lái)有的類包不一定用到,寫(xiě)的類包越多的時(shí)候,加載的東西就不少了,影響程序的性能。
通過(guò)PHP的反射類 ReflectionClass 可以直接獲得對(duì)應(yīng)類的一個(gè)反射類:
test.php文件如下:
<?php class test{ public function showName(){ var_dump(__CLASS__); } } ?>
index.php文件如下:
<?php var_dump(get_included_files()); $rf = new ReflectionClass('test'); var_dump(get_included_files()); $testObj = $rf->newInstance(); $testObj->showName(); function __autoload($classname){ $classpath = './' . $classname . '.php'; if (file_exists($classpath)) { require_once($classpath); }else { echo 'class file'.$classpath.'not found!'; } } ?> //array // 0 => string 'D:\code\www\test\index.php'(length=26) //array // 0 => string 'D:\code\www\test\index.php'(length=26) // 1 => string 'D:\code\www\text\test.php'(length=25) //string 'test' (length=4)
實(shí)例化一個(gè) ReflectionClass,并傳類名進(jìn)去,就會(huì)得到一個(gè)對(duì)應(yīng)類的反射類。用實(shí)例調(diào)用 newInstance就會(huì)得到反射類的實(shí)例,這樣就完成了實(shí)例化。
通過(guò) get_included_files() 方法,我們可以看到當(dāng)前頁(yè)面引入的文件。在實(shí)例化反射類前,只有index.php文件,實(shí)例化反射類后,自動(dòng)引入了一個(gè)test.php文件,那么看下上面那段代碼,發(fā)現(xiàn)有個(gè)__autoload()名字的魔術(shù)方法,這方法就定義了自動(dòng)加載文件,而ReflectionClass在當(dāng)前頁(yè)面找不到類時(shí),就會(huì)調(diào)用__autoload()去加載類。這就是自動(dòng)加載的過(guò)程。
想知道__autoload()方法有沒(méi)有開(kāi)啟,可以通過(guò)PHP的標(biāo)準(zhǔn)庫(kù)SPL中的方法來(lái)查看:
var_dump(spl_autoload_functions()); spl_autoload_register('newAutoload'); var_dump(spl_autoload_functions()); $testObj1 = getInstance('test'); $testObj2 = getInstance('test'); $testObj3 = getInstance('test'); function getInstance($class, $returnInstance = false){ $rf = new ReflectionClass($class); if ($returnInstance) return $rf->newInstance(); } function newAutoload($classname){ $classpath = './' . $classname . '.php'; if (file_exists($classpath)) { var_dump('require success'); require_once($classpath); } else { echo 'class file ' . $classpath . ' not found!'; } } //array // 0 => string '__autoload' (length=10) //array // 0 => string 'newAutoload' (length=11) //string 'require success' (length=15)
sql_autoload_functions() 方法是用來(lái)查看當(dāng)前自動(dòng)加載的方法,當(dāng)前有個(gè)__autoload魔術(shù)方法,所以返回了函數(shù)名,若沒(méi)定義自動(dòng)加載方法的話,返回的是false,而 spl_autoload_register() 方法是通過(guò)方法名將一個(gè)方法注冊(cè)到自動(dòng)加載方法,這里用newAutoload方法來(lái)替換__autoload方法。
newAutoload方法中,每執(zhí)行成功一次,打印一句'require success',這里只打印了一次,說(shuō)明了雖然實(shí)例了3次ReflectionClass('test'),但因?yàn)閠est類已經(jīng)加載過(guò)一次,就不會(huì)再執(zhí)行自動(dòng)加載的方法。通過(guò)getInstance()這種加載類的方法,比以前的include()之類的方便多了,只需要加載這個(gè)寫(xiě)了getInstance()方法的文件就可以了。
重寫(xiě)的自動(dòng)加載方法可以根據(jù)需要,通過(guò)判斷類的名字,定義不同的文件路徑。getInstance可以用靜態(tài)變量保存實(shí)例,這也是使用到了設(shè)計(jì)模式中的單例模式。
希望本文所述對(duì)大家的php程序設(shè)計(jì)有所幫助。
- 基于jquery的圖片懶加載js
- 基于javascript實(shí)現(xiàn)圖片懶加載
- javascript瀑布流式圖片懶加載實(shí)例解析與優(yōu)化
- javascript瀑布流式圖片懶加載實(shí)例
- Struts2在打包json格式的懶加載異常問(wèn)題
- jQuery+ajax實(shí)現(xiàn)滾動(dòng)到頁(yè)面底部自動(dòng)加載圖文列表效果(類似圖片懶加載)
- 解析iOS應(yīng)用的UI開(kāi)發(fā)中懶加載和xib的簡(jiǎn)單使用方法
- 淺談angular懶加載的一些坑
- Angular懶加載機(jī)制刷新后無(wú)法回退的快速解決方法
- Javascript實(shí)現(xiàn)圖片懶加載插件的方法
相關(guān)文章
PHP實(shí)現(xiàn)二叉樹(shù)的深度優(yōu)先與廣度優(yōu)先遍歷方法
這篇文章主要介紹了PHP實(shí)現(xiàn)二叉樹(shù)的深度優(yōu)先與廣度優(yōu)先遍歷方法,涉及php針對(duì)二叉樹(shù)進(jìn)行遍歷的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09php表單請(qǐng)求獲得數(shù)據(jù)求和示例
這篇文章主要介紹了php表單請(qǐng)求獲得數(shù)據(jù)求和實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-05-05PHP實(shí)時(shí)統(tǒng)計(jì)中文字?jǐn)?shù)和區(qū)別
今天小編就為大家分享一篇關(guān)于PHP統(tǒng)計(jì)實(shí)時(shí)統(tǒng)計(jì)漢字個(gè)數(shù)和區(qū)別,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02PHP+JS+rsa數(shù)據(jù)加密傳輸實(shí)現(xiàn)代碼
PHP+JS+rsa數(shù)據(jù)加密傳輸實(shí)現(xiàn)代碼,需要的朋友可以參考下。2011-03-03php基于curl實(shí)現(xiàn)的股票信息查詢類實(shí)例
這篇文章主要介紹了php基于curl實(shí)現(xiàn)的股票信息查詢類,結(jié)合完整實(shí)例形式分析了php使用curl調(diào)用API接口實(shí)現(xiàn)股票信息查詢功能的相關(guān)操作技巧,需要的朋友可以參考下2016-11-11PHP mail 通過(guò)Windows的SMTP發(fā)送郵件失敗的解決方案
今天調(diào)試WordPress的郵件發(fā)送功能,總是提示:SMTP server response: 501 5.5.4 Invalid Address。用telnet測(cè)試SMTP是沒(méi)有任何問(wèn)題的2009-05-05