PHP實現懶載入

2022-02-09 00:25:24 字數 3575 閱讀 4258

尋常php的載入是通過include(),require()等方法來載入外部檔案,之後再通過例項呼叫方法或直接呼叫靜態方法,而這樣子寫引入語句實在很麻煩,有的框架會將特定路徑的檔案全部引入,直接例項化就能使用,但這樣一來有的類包不一定用到,寫的類包越多的時候,載入的東西就不少了,影響程式的效能。

通過php的反射類 reflectionclass 可以直接獲得對應類的乙個反射類:?1

2345

6789

1011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

<?php

classtest

}

?>

<?php

var_dump(get_included_files());

$rf=newreflectionclass('test');

var_dump(get_included_files());

$testobj=$rf->newinstance();

$testobj->showname();

function__autoload($classname)else

}

?>

//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中的方法來檢視:?1

2345

6789

1011

1213

1415

1617

1819

2021

2223

2425

2627

2829

var_dump(spl_autoload_functions());

spl_autoload_register('newautoload');

var_dump(spl_autoload_functions());

$testobj1= getinstance('test');

$testobj2= getinstance('test');

$testobj3= getinstance('test');

functiongetinstance($class,$returninstance= false)

functionnewautoload($classname)else

}

//array

//  0 => string '__autoload' (length=10)

//array

//  0 => string 'newautoload' (length=11)

//string 'require success' (length=15)

spl_autoload_functions() 方法是用來檢視當前自動載入的方法,當前有個__autoload魔術方法,所以返回了函式名,若沒定義自動載入方法的話,返回的是false,而 spl_autoload_register() 方法是通過方法名將乙個方法註冊到自動載入方法,這裡用newautoload方法來替換__autoload方法。

newautoload方法中,每執行成功一次,列印一句'require success',這裡只列印了一次,說明了雖然例項了3次reflectionclass('test'),但因為test類已經載入過一次,就不會再執行自動載入的方法。通過getinstance()這種載入類的方法,比以前的include()之類的方便多了,只需要載入這個寫了getinstance()方法的檔案就可以了。

重寫的自動載入方法可以根據需要,通過判斷類的名字,定義不同的檔案路徑。getinstance可以用靜態變數儲存例項,這也是使用到了設計模式中的單例模式。

php之自動載入(懶載入)

有a類和b類,如果在a類例項化b類,最簡單直接的方法就是在b中使用include require once a的檔案,但是這種方法顯然是不友好的,在框架中葉不是這麼做的,在框架中使用的是自動載入的機制也成為懶載入。php中自動載入使用spl autoload register來完成在沒有指定類的情況...

mysql 懶載入 懶載入和預載入實現解析

1.懶載入 懶載入的要點如下 1.進入可視區域之後請求資源 2.對於電商等較多,頁面很長的業務場景很適用 3.可以減少無效資源的載入 4.併發載入的資源過多會阻塞js的載入,影響 的正常使用 如何實現懶載入呢?要點就是html中img標籤src屬性為空,或者可以設定乙個載入中的友好提示,給乙個dat...

android Fragment實現懶載入

效果 activity中viewpager巢狀多個fragment.當切換到這個這個fragment時才進行初始化,減少activity初始化操作 方法 setuservisiblehint方法是判斷fragment中的ui控制項是否可見的。可以自行實現,在ui控制項可見時進行載入的操作。注 set...