《PHP編程:PHP實(shí)現(xiàn)懶加載的方法》要點(diǎn):
本文介紹了PHP編程:PHP實(shí)現(xiàn)懶加載的方法,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
PHP實(shí)例本文實(shí)例講述了PHP實(shí)現(xiàn)懶加載的辦法.分享給大家供大家參考.具體分析如下:
PHP實(shí)例尋常php的加載是通過include(),require()等辦法來加載外部文件,之后再通過實(shí)例調(diào)用辦法或直接調(diào)用靜態(tài)辦法,而這樣子寫引入語句實(shí)在很麻煩,有的框架會(huì)將特定路徑的文件全部引入,直接實(shí)例化就能使用,但這樣一來有的類包不一定用到,寫的類包越多的時(shí)候,加載的東西就不少了,影響程序的性能.
PHP實(shí)例通過PHP的反射類 ReflectionClass 可以直接獲得對(duì)應(yīng)類的一個(gè)反射類:
PHP實(shí)例test.php文件如下:
PHP實(shí)例
<?php
class test{
public function showName(){
var_dump(__CLASS__);
}
}
?>
PHP實(shí)例index.php文件如下:
PHP實(shí)例
<?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)
PHP實(shí)例實(shí)例化一個(gè) ReflectionClass,并傳類名進(jìn)去,就會(huì)得到一個(gè)對(duì)應(yīng)類的反射類.用實(shí)例調(diào)用 newInstance就會(huì)得到反射類的實(shí)例,這樣就完成了實(shí)例化.
PHP實(shí)例通過 get_included_files() 辦法,我們可以看到當(dāng)前頁面引入的文件.在實(shí)例化反射類前,只有index.php文件,實(shí)例化反射類后,自動(dòng)引入了一個(gè)test.php文件,那么看下上面那段代碼,發(fā)現(xiàn)有個(gè)__autoload()名字的魔術(shù)辦法,這辦法就定義了自動(dòng)加載文件,而ReflectionClass在當(dāng)前頁面找不到類時(shí),就會(huì)調(diào)用__autoload()去加載類.這就是自動(dòng)加載的過程.
PHP實(shí)例想知道__autoload()辦法有沒有開啟,可以通過PHP的標(biāo)準(zhǔn)庫SPL中的辦法來查看:
PHP實(shí)例
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實(shí)例sql_autoload_functions() 辦法是用來查看當(dāng)前自動(dòng)加載的辦法,當(dāng)前有個(gè)__autoload魔術(shù)辦法,所以返回了函數(shù)名,若沒定義自動(dòng)加載辦法的話,返回的是false,而 spl_autoload_register() 辦法是通過辦法名將一個(gè)辦法注冊(cè)到自動(dòng)加載辦法,這里用newAutoload辦法來替換__autoload辦法.
PHP實(shí)例newAutoload辦法中,每執(zhí)行成功一次,打印一句'require success',這里只打印了一次,說明了雖然實(shí)例了3次ReflectionClass('test'),但因?yàn)閠est類已經(jīng)加載過一次,就不會(huì)再執(zhí)行自動(dòng)加載的辦法.通過getInstance()這種加載類的辦法,比以前的include()之類的方便多了,只需要加載這個(gè)寫了getInstance()辦法的文件就可以了.
PHP實(shí)例重寫的自動(dòng)加載辦法可以根據(jù)需要,通過判斷類的名字,定義不同的文件路徑.getInstance可以用靜態(tài)變量保存實(shí)例,這也是使用到了設(shè)計(jì)模式中的單例模式.
PHP實(shí)例希望本文所述對(duì)大家的php程序設(shè)計(jì)有所贊助.
維易PHP培訓(xùn)學(xué)院每天發(fā)布《PHP編程:PHP實(shí)現(xiàn)懶加載的方法》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/11852.html