PHP實(shí)現(xiàn)懶加載的方法
來源:易賢網(wǎng) 閱讀:700 次 日期:2015-03-09 15:22:39
溫馨提示:易賢網(wǎng)小編為您整理了“PHP實(shí)現(xiàn)懶加載的方法”,方便廣大網(wǎng)友查閱!

這篇文章主要介紹了PHP實(shí)現(xiàn)懶加載的方法,實(shí)例分析了php加載的原理與懶加載的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了PHP實(shí)現(xiàn)懶加載的方法。分享給大家供大家參考。具體分析如下:

尋常php的加載是通過include(),require()等方法來加載外部文件,之后再通過實(shí)例調(diào)用方法或直接調(diào)用靜態(tài)方法,而這樣子寫引入語句實(shí)在很麻煩,有的框架會(huì)將特定路徑的文件全部引入,直接實(shí)例化就能使用,但這樣一來有的類包不一定用到,寫的類包越多的時(shí)候,加載的東西就不少了,影響程序的性能。

通過PHP的反射類 ReflectionClass 可以直接獲得對(duì)應(yīng)類的一個(gè)反射類:

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)

實(shí)例化一個(gè) ReflectionClass,并傳類名進(jìn)去,就會(huì)得到一個(gè)對(duì)應(yīng)類的反射類。用實(shí)例調(diào)用 newInstance就會(huì)得到反射類的實(shí)例,這樣就完成了實(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)加載的過程。

想知道__autoload()方法有沒有開啟,可以通過PHP的標(biāo)準(zhǔn)庫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)加載的方法,當(dāng)前有個(gè)__autoload魔術(shù)方法,所以返回了函數(shù)名,若沒定義自動(dòng)加載方法的話,返回的是false,而 spl_autoload_register() 方法是通過方法名將一個(gè)方法注冊(cè)到自動(dòng)加載方法,這里用newAutoload方法來替換__autoload方法。

newAutoload方法中,每執(zhí)行成功一次,打印一句'require success',這里只打印了一次,說明了雖然實(shí)例了3次ReflectionClass('test'),但因?yàn)閠est類已經(jīng)加載過一次,就不會(huì)再執(zhí)行自動(dòng)加載的方法。通過getInstance()這種加載類的方法,比以前的include()之類的方便多了,只需要加載這個(gè)寫了getInstance()方法的文件就可以了。

重寫的自動(dòng)加載方法可以根據(jù)需要,通過判斷類的名字,定義不同的文件路徑。getInstance可以用靜態(tài)變量保存實(shí)例,這也是使用到了設(shè)計(jì)模式中的單例模式。

希望本文所述對(duì)大家的php程序設(shè)計(jì)有所幫助。

更多信息請(qǐng)查看IT技術(shù)專欄

更多信息請(qǐng)查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:PHP實(shí)現(xiàn)懶加載的方法
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國考·省考課程試聽報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)