PHP自動加載上——spl_autoload_register


spl_autoload_register函數是實現自動加載未定義類功能的的重要方法,所謂的自動加載意思就是 我們的new 一個類的時候必須先include或者require的類文件,如果沒有include或者require,則會報錯。那這樣我們就必須在文件頭部寫上許多include或require文件,非常麻煩,
為了使得沒有include或者require類的時候也正常new一個類,所以有了自動加載的概念,也就是說new一個類之前不用事先包含類文件也可以正常new,這樣我們的文件頭部就不用包含許多include(require)。其實這算一種封裝!

用spl_autoload_register函數可以實現上面說的功能,我們來看看實現原理。這個函數的參數如下:

autoload_function
這是一個函數【方法】名稱,可以是字符串或者數組(調用類方法使用)。這個函數(方法)的功能就是,來把需要new 的類文件包含include(requeire)進來,這樣new的時候就不會找不到文件了。其實就是封裝整個項目的include和require功能。

throw
此參數設置了 autoload_function 無法成功注冊時, spl_autoload_register()是否拋出異常。

prepend
如果是 true,spl_autoload_register() 會添加函數到隊列之首,而不是隊列尾部。

當我們new一個類,並且這個類文件沒有被包含時候就會執行這個autoload_function方法:
先來看一個錯誤例子:

//當我們直接new一個未包含class類文件時候會報錯
$objDemo = new AutoloadClass();
/**
Fatal error: Uncaught Error: Class 'AutoloadClass' not found in E:\work\demo\spl\autoloadDemo.php on line 3

Error: Class 'AutoloadClass' not found in E:\work\demo\spl\autoloadDemo.php on line 3
*/

使用spl_autoload_register方法

//文件 autoloadClass.php ,需要new的文件
class AutoloadClass{

    public function __construct()
    {
        echo '你已經包含我了';
    }
}

//文件autoloadDemo.php文件
spl_autoload_register('myAutoLoad', true, true);
function myAutoLoad($className){
    echo "所有的包含文件工作都交給我!\r\n";
    $classFileName = "./{$className}.php";
    echo "我來包含!{$classFileName}\r\n";
    include "./{$className}.php";
}
$objDemo = new AutoloadClass();
/**
輸出:
所有的包含文件工作都交給我!
我來包含!./AutoloadClass.php
你已經包含我了
*/

通過上面例子我們可以看到,當new一個未包含的類時候,會去執行spl_autoload_register第一個參數函數名的函數,這個函數有一個參數就是需要new的類名,這個函數的功能就是把這個類給包含進來(類名和文件名一致),這樣就實現了自動加載功能。原理就是這樣,不是很復雜。
另外我們可以改為匿名函數來實現:

spl_autoload_register(function ($className)
{
    echo "所有的包含文件工作都交給我!\r\n";
    $classFileName = "./{$className}.php";
    echo "我來包含!{$classFileName}\r\n";
    include "./{$className}.php";
}, true, true);
$objDemo = new AutoloadClass();
/**
輸出:
所有的包含文件工作都交給我!
我來包含!./AutoloadClass.php
你已經包含我了
*/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM