首頁  >  文章  >  後端開發  >  PHP的反射與自動載入

PHP的反射與自動載入

*文
*文原創
2017-12-25 16:33:431584瀏覽

本文主要介紹了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(&#39;test&#39;);
var_dump(get_included_files());
$testObj = $rf->newInstance();
$testObj->showName();
function __autoload($classname){
  $classpath = &#39;./&#39; . $classname . &#39;.php&#39;;
  if (file_exists($classpath)) {
    require_once($classpath);
  }else {
    echo &#39;class file&#39;.$classpath.&#39;not found!&#39;;
  }
}
?>
//array
// 0 => string &#39;D:\code\www\test\index.php&#39;(length=26)
//array
// 0 => string &#39;D:\code\www\test\index.php&#39;(length=26)
// 1 => string &#39;D:\code\www\text\test.php&#39;(length=25)
//string &#39;test&#39; (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(&#39;newAutoload&#39;);
var_dump(spl_autoload_functions());
$testObj1 = getInstance(&#39;test&#39;);
$testObj2 = getInstance(&#39;test&#39;);
$testObj3 = getInstance(&#39;test&#39;);
function getInstance($class, $returnInstance = false){
  $rf = new ReflectionClass($class);
  if ($returnInstance)
     return $rf->newInstance();
}
function newAutoload($classname){
  $classpath = &#39;./&#39; . $classname . &#39;.php&#39;;
  if (file_exists($classpath)) {
    var_dump(&#39;require success&#39;);
    require_once($classpath);
  } else {
    echo &#39;class file &#39; . $classpath . &#39; not found!&#39;;
  }
}
//array
// 0 => string &#39;__autoload&#39; (length=10)
//array
// 0 => string &#39;newAutoload&#39; (length=11)
//string &#39;require success&#39; (length=15)


sql_autoload_functions() 方法是用來查看目前自動載入的方法,目前有個__autoload魔術方法,所以回傳了函數名,若沒定義自動載入方法的話,回傳的是false,而spl_autoload_register()方法是透過方法名稱將一個方法註冊到自動載入方法,這裡用newAutoload方法來取代__autoload方法。

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

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

相關推薦:

PHP 自動載入物件(以MVC框架替例)

php 自動載入函數__autoload()

#php 反射機制

以上是PHP的反射與自動載入的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn