本文主要介紹了PHP的反射與自動加載,實例分析了php加載的原理與自動加載的實現技巧,希望對大家理解PHP的反射與自動加載有所幫助。
本文實例講述了PHP實作懶載入的方法。分享給大家供大家參考。具體分析如下:
尋常php的載入是透過include(),require()等方法來載入外部文件,之後再透過實例呼叫方法或直接呼叫靜態方法,而這樣子寫引入語句實在很麻煩,有的框架會將特定路徑的檔案全部引入,直接實例化就能使用,但這樣一來有的類別包不一定用到,寫的類別包越多的時候,載入的東西就不少了,影響程序的性能。
透過PHP的反射類別ReflectionClass 可以直接取得對應類別的反射類別:
test.php檔案如下:
##
<?php class test{ public function showName(){ var_dump(__CLASS__); } } ?>
#
<?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)
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)
相關推薦:
以上是PHP的反射與自動載入的詳細內容。更多資訊請關注PHP中文網其他相關文章!