PHP自動載入機制介紹——spl_autoload_register()函數,php類自動載入

2020-07-16 10:05:46
* include 和 require 功能是一樣的,它們的不同在於 include 出錯時只會產生警告,而 require 會丟擲錯誤終止指令碼。

* include_once 和 include 唯一的區別在於 include_once 會檢查檔案是否已經引入,如果是則不會重複引入。

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方法

先來看一個錯誤例子:+++++++++++++++++++++

<?php
//當我們直接new一個未包含class類檔案時候會報錯
$objDemo = new AutoloadClass();

正確的使用 spl_autoload_register() 函數

通過下面例子我們可以看到,當new一個未包含的類時候,會去執行spl_autoload_register第一個引數函數名的函數,這個函數有一個引數就是需要new的類名,這個函數的功能就是把這個類給包含進來(類名和檔名一致),這樣就實現了自動載入功能。原理就是這樣,不是很複雜。

<?php
// 定義工具類在伺服器位置 常數
define('TOOLS_ROOT', __DIR__ . '/');
 
//檔案 autoloadClass.php ,需要new的檔案
class AutoloadClass{
 
    public function __construct()
    {
        // echo '你已經包含我了';
    }
}
//檔案autoloadDemo.php檔案
spl_autoload_register('myAutoLoad', true, true);
function myAutoLoad($className){
    $classFileName = TOOLS_ROOT."{$className}.php";
    include $classFileName;
}

另外,我們可以改為匿名函數來實現:

<?php
 
// 定義工具類在伺服器位置 常數
define('TOOLS_ROOT', __DIR__ . '/');
 
//檔案 autoloadClass.php ,需要new的檔案
class AutoloadClass{
 
    public function __construct()
    {
        // echo '你已經包含我了';
    }
}
spl_autoload_register(function ($className)
{
    $classFileName = TOOLS_ROOT."{$className}.php";
    include $classFileName;
}, true, true);
$objDemo = new AutoloadClass();

以上就是PHP自動載入機制介紹——spl_autoload_register()函數,php類自動載入的詳細內容,更多請關注TW511.COM其它相關文章!