PHP實現(xiàn)懶加載的方法
本文實例講述了PHP實現(xiàn)懶加載的方法。分享給大家供大家參考。具體分析如下:
尋常php的加載是通過include(),require()等方法來加載外部文件,之后再通過實例調(diào)用方法或直接調(diào)用靜態(tài)方法,而這樣子寫引入語句實在很麻煩,有的框架會將特定路徑的文件全部引入,直接實例化就能使用,但這樣一來有的類包不一定用到,寫的類包越多的時候,加載的東西就不少了,影響程序的性能。
通過PHP的反射類 ReflectionClass 可以直接獲得對應(yīng)類的一個反射類:
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,并傳類名進去,就會得到一個對應(yīng)類的反射類。用實例調(diào)用 newInstance就會得到反射類的實例,這樣就完成了實例化。
通過 get_included_files() 方法,我們可以看到當(dāng)前頁面引入的文件。在實例化反射類前,只有index.php文件,實例化反射類后,自動引入了一個test.php文件,那么看下上面那段代碼,發(fā)現(xiàn)有個__autoload()名字的魔術(shù)方法,這方法就定義了自動加載文件,而ReflectionClass在當(dāng)前頁面找不到類時,就會調(diào)用__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() 方法是用來查看當(dāng)前自動加載的方法,當(dāng)前有個__autoload魔術(shù)方法,所以返回了函數(shù)名,若沒定義自動加載方法的話,返回的是false,而 spl_autoload_register() 方法是通過方法名將一個方法注冊到自動加載方法,這里用newAutoload方法來替換__autoload方法。
newAutoload方法中,每執(zhí)行成功一次,打印一句'require success',這里只打印了一次,說明了雖然實例了3次ReflectionClass('test'),但因為test類已經(jīng)加載過一次,就不會再執(zhí)行自動加載的方法。通過getInstance()這種加載類的方法,比以前的include()之類的方便多了,只需要加載這個寫了getInstance()方法的文件就可以了。
重寫的自動加載方法可以根據(jù)需要,通過判斷類的名字,定義不同的文件路徑。getInstance可以用靜態(tài)變量保存實例,這也是使用到了設(shè)計模式中的單例模式。
希望本文所述對大家的php程序設(shè)計有所幫助。
相關(guān)文章
PHP中explode函數(shù)和split函數(shù)的區(qū)別小結(jié)
相信大家都知道,explode和split在php中都是可以通過特定字符把字符串轉(zhuǎn)換成數(shù)組的,那么explode和split既然是一樣的為什么會有兩個函數(shù)呢,那么explode和split的區(qū)別在哪里呢,下面跟著小編我們一起來看看。2016-08-08
php下一個阿拉伯?dāng)?shù)字轉(zhuǎn)中文數(shù)字的函數(shù)
php下一個阿拉伯?dāng)?shù)字轉(zhuǎn)中文數(shù)字的函數(shù)...2007-07-07
現(xiàn)在很多網(wǎng)站都存在跨站腳本攻擊漏洞,讓黑客有機可乘.跨站攻擊很容易就可以構(gòu)造,而且非常隱蔽,不易被查覺(通常盜取信息后馬上跳轉(zhuǎn)回原頁面)。如何攻擊,在此不作介紹,主要談?wù)勅绾畏婪丁?/div> 2015-09-09
php使用指定編碼導(dǎo)出mysql數(shù)據(jù)到csv文件的方法
這篇文章主要介紹了php使用指定編碼導(dǎo)出mysql數(shù)據(jù)到csv文件的方法,涉及php查詢mysql及操作csv文件的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03
PHP建立MySQL與MySQLi持久化連接(長連接)區(qū)別
MySQL是一種流行的關(guān)系型數(shù)據(jù)庫,而PHP為其提供了兩種不同的API,即MySQL和MySQLi,在使用這兩個API時,我們可以選擇使用持久連接或非持久連接,MySQL的持久連接需使用`mysql_pconnect`,而MySQLi持久連接默認啟用,使用持久連接時應(yīng)注意服務(wù)器連接限制和資源占用問題2025-02-02最新評論

