国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > PHP > 正文

PHP實(shí)現(xiàn)懶加載的方法

2024-05-04 23:32:05
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

這篇文章主要介紹了PHP實(shí)現(xiàn)懶加載的方法,實(shí)例分析了php加載的原理與懶加載的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了PHP實(shí)現(xiàn)懶加載的方法。分享給大家供大家參考。具體分析如下:

尋常php的加載是通過(guò)include(),require()等方法來(lái)加載外部文件,之后再通過(guò)實(shí)例調(diào)用方法或直接調(diào)用靜態(tài)方法,而這樣子寫引入語(yǔ)句實(shí)在很麻煩,有的框架會(huì)將特定路徑的文件全部引入,直接實(shí)例化就能使用,但這樣一來(lái)有的類包不一定用到,寫的類包越多的時(shí)候,加載的東西就不少了,影響程序的性能。

通過(guò)PHP的反射類 ReflectionClass 可以直接獲得對(duì)應(yīng)類的一個(gè)反射類:

test.php文件如下:

 

 
  1. <?php 
  2. class test{ 
  3. public function showName(){ 
  4. var_dump(__CLASS__); 
  5. ?> 

index.php文件如下:

 

 
  1. <?php 
  2. var_dump(get_included_files());  
  3. $rf = new ReflectionClass('test'); 
  4. var_dump(get_included_files()); 
  5. $testObj = $rf->newInstance(); 
  6. $testObj->showName(); 
  7. function __autoload($classname){ 
  8. $classpath = './' . $classname . '.php'
  9. if (file_exists($classpath)) { 
  10. require_once($classpath); 
  11. }else { 
  12. echo 'class file'.$classpath.'not found!'
  13. ?> 
  14. //array 
  15. // 0 => string 'D:/code/www/test/index.php'(length=26) 
  16. //array 
  17. // 0 => string 'D:/code/www/test/index.php'(length=26) 
  18. // 1 => string 'D:/code/www/text/test.php'(length=25) 
  19. //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)查看:

 

 
  1. var_dump(spl_autoload_functions()); 
  2. spl_autoload_register('newAutoload'); 
  3. var_dump(spl_autoload_functions()); 
  4. $testObj1 = getInstance('test'); 
  5. $testObj2 = getInstance('test'); 
  6. $testObj3 = getInstance('test'); 
  7. function getInstance($class, $returnInstance = false){ 
  8. $rf = new ReflectionClass($class); 
  9. if ($returnInstance) 
  10. return $rf->newInstance(); 
  11. function newAutoload($classname){ 
  12. $classpath = './' . $classname . '.php'
  13. if (file_exists($classpath)) { 
  14. var_dump('require success'); 
  15. require_once($classpath); 
  16. else { 
  17. echo 'class file ' . $classpath . ' not found!'
  18. //array 
  19. // 0 => string '__autoload' (length=10) 
  20. //array 
  21. // 0 => string 'newAutoload' (length=11) 
  22. //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è)寫了getInstance()方法的文件就可以了。

重寫的自動(dòng)加載方法可以根據(jù)需要,通過(guò)判斷類的名字,定義不同的文件路徑。getInstance可以用靜態(tài)變量保存實(shí)例,這也是使用到了設(shè)計(jì)模式中的單例模式。

希望本文所述對(duì)大家的php程序設(shè)計(jì)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 广宁县| 辽宁省| 老河口市| 广德县| 文化| 辽阳县| 峡江县| 四子王旗| 嘉峪关市| 瑞安市| 阿图什市| 韩城市| 左权县| 遵义县| 德昌县| 吉木乃县| 东乡| 杨浦区| 石狮市| 嘉兴市| 丹阳市| 徐闻县| 铅山县| 苏尼特左旗| 梧州市| 内乡县| 徐汇区| 南宁市| 抚远县| 吴堡县| 唐河县| 轮台县| 安义县| 台江县| 家居| 罗源县| 伊通| 额济纳旗| 宁化县| 拜泉县| 辰溪县|