PHP的SPL庫做爲擴展庫,已經於5.3.0版本後默認保持開啓,成爲PHP的一組強大的核心擴展庫。你們有時間能夠多研究研究SPL裏面的方法功能。並且,SPL中包含不少類庫喲,在設計模式的系列文章中,咱們也會再次見到他們的身影!php
這回咱們創建一個文件,叫作spl_autoload_register.php,而後將下面的代碼複製進去吧:git
<?php
spl_autoload_register(function( $className ){
require $className . '.php';
});
$m = new TestClass();
$m->show();
複製代碼
是否是和__autoload()很像,固然做用也很像。咱們直接運行這個文件試試,會發現TestClass.php也正常的加載了進來。那麼爲啥不直接用__autoload()函數,而使用sql_autoload_register()這麼詭異的函數,並且還有個神奇的閉包參數!!!github
咱們先看看它的定義和格式面試
註冊給定的函數做爲 __autoload 的實現sql
沒錯,那個匿名函數就是一個__autoload()函數,咱們能夠理解爲給當前這個PHP文件中註冊一個__autoload()函數,而使用匿名函數的緣由呢?固然就是爲了閉包特性,最主要的就是可以帶來延遲加載(懶加載 )的實現!設計模式
另外,spl_autoload_register()函數不止是僅僅去註冊一個__autoload(),它實現並維護了一個__autoload()隊列。原來在一個文件中只能有一個__autoload()方法,但如今,你擁有的是一個隊列。閉包
spl_autoload_register ([ callable throw = true [, bool $prepend = false ]]] ) : boolcomposer
有點長,咱們一步步看:函數
嗯,到這裏好像有點複雜了,咱們須要改造改造代碼這樣才能讓你們看得更清晰,先準備另外一個須要加載 的類文件,就叫CaseClass.php好了測試
<?php
class CaseClass {
public function show() {
echo "Good!\n";
}
}
複製代碼
而後修改spl_autoload_register.php文件
<?php
// 使用匿名函數方式
spl_autoload_register(function( $className ){
echo "first==>\n";
require_once 'TestClass.php';
});
// 須要註冊的外部__autoload()實現
spl_autoload_register('CaseAutoLoad');
function CaseAutoLoad( $className ){
echo "second==>\n";
require_once 'CaseClass.php';
}
$m = new TestClass();
$m->show();
echo "--------\n";
$s = new CaseClass();
$s->show();
複製代碼
什麼都別說了,直接運行吧,若是有報錯請檢查下哪裏寫錯了,反正我這裏沒錯~~
正常狀況下應該輸出這樣的內容
到這裏,你已經知道了這個函數最大的做用就是維護的這個隊列而且能夠延遲加載咱們須要的文件。是否是感受有點要走上人生巔峯了?不不不,你內心或許還在疑惑,這玩意跟Composer有啥關係?
請在您須要測試的目錄初始化一個Composer
OK,走到這裏,其實在面試的時候就能夠跟面試官司吹牛了,Composer的原理?spl_autoload_register()方法嘛。說不定確實有很多人就被你唬住了,可是,對於Composer來講,咱們還有一個很是重要的方面不能忽略,能夠將它看做是Composer的血肉,讓自動加載可以有形,成爲一個有靈魂有軀體的完整的人,這就是PSR規範中的PSR0和PSR4規範,下篇咱們就聊聊這倆貨!
完整源碼:GitHub