程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> PHP實現懶加載的方法

PHP實現懶加載的方法

編輯:PHP綜合

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

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

通過PHP的反射類 ReflectionClass 可以直接獲得對應類的一個反射類:

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)

實例化一個 ReflectionClass,並傳類名進去,就會得到一個對應類的反射類。用實例調用 newInstance就會得到反射類的實例,這樣就完成了實例化。

通過 get_included_files() 方法,我們可以看到當前頁面引入的文件。在實例化反射類前,只有index.php文件,實例化反射類後,自動引入了一個test.php文件,那麼看下上面那段代碼,發現有個__autoload()名字的魔術方法,這方法就定義了自動加載文件,而ReflectionClass在當前頁面找不到類時,就會調用__autoload()去加載類。這就是自動加載的過程。

想知道__autoload()方法有沒有開啟,可以通過PHP的標准庫SPL中的方法來查看:

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() 方法是用來查看當前自動加載的方法,當前有個__autoload魔術方法,所以返回了函數名,若沒定義自動加載方法的話,返回的是false,而 spl_autoload_register() 方法是通過方法名將一個方法注冊到自動加載方法,這裡用newAutoload方法來替換__autoload方法。

newAutoload方法中,每執行成功一次,打印一句'require success',這裡只打印了一次,說明了雖然實例了3次ReflectionClass('test'),但因為test類已經加載過一次,就不會再執行自動加載的方法。通過getInstance()這種加載類的方法,比以前的include()之類的方便多了,只需要加載這個寫了getInstance()方法的文件就可以了。

重寫的自動加載方法可以根據需要,通過判斷類的名字,定義不同的文件路徑。getInstance可以用靜態變量保存實例,這也是使用到了設計模式中的單例模式。

希望本文所述對大家的php程序設計有所幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved