尋常php的載入是通過include(),require()等方法來載入外部檔案,之後再通過例項呼叫方法或直接呼叫靜態方法,而這樣子寫引入語句實在很麻煩,有的框架會將特定路徑的檔案全部引入,直接例項化就能使用,但這樣一來有的類包不一定用到,寫的類包越多的時候,載入的東西就不少了,影響程式的效能。
通過php的反射類 reflectionclass 可以直接獲得對應類的乙個反射類:?1
2345
6789
1011
1213
1415
1617
1819
2021
2223
2425
2627
2829
3031
3233
<?php
class
test
}
?>
<?php
var_dump(get_included_files());
$rf
=
new
reflectionclass(
'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'
);
function
getinstance(
$class
,
$returninstance
= false)
function
newautoload(
$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...