您好,登錄后才能下訂單哦!
使用PHP怎么實現一個懶加載方法?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
通過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怎么實現一個懶加載方法問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。