* 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其它相關文章!