* 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相關知識,請訪問PHP中文網!
以上是PHP自動載入機制介紹-spl_autoload_register()函數,php類別自動載入的詳細內容。更多資訊請關注PHP中文網其他相關文章!