您好,登錄后才能下訂單哦!
本篇內容主要講解“PHP SPL擴展庫的使用方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“PHP SPL擴展庫的使用方法”吧!
這是一個自動加載函數,在PHP5中,當我們實例化一個未定義的類時,就會觸發此函數。看下面例子:
./myClass.php <?php class myClass { public function __construct() { echo "myClass init'ed successfuly!!!"; } } ?> ./index.php <?php // we've writen this code where we need function __autoload($classname) { $filename = "./". $classname .".php"; include_once($filename); } // we've called a class *** $obj = new myClass(); ?>
從上面能看到這是兩個文件,下面的index.php 中,new了個 myClass類,但是明顯本文件不存在,現在就會自動調用 __autoload函數,并 把 “myClass”這個類名字符串 直接作為參數傳給__autoload, 此時自動加載函數內部就可以引入該文件了,引入后就正常初始化該類了。 該函數在PHP 7.2.0后被廢棄了。
spl_autoload_register 可以將 函數自動注冊,也就是說,當PHP文件內訪問了一個不存在的類時,會自動去調用該函數,然后執行該函數內部的函數,看起來和 autoload的作用是一樣的。但是其實spl_autoload_register 這個函數功能更強大, autoload的參數 僅僅是一個函數名,這是定死的。并且只能聲明一次, 使用了autoload后,就不能再次使用該函數了。
請注意:一個項目中只能有一個__autoload, 如果在PHP在執行過程中遇到兩個__autoload會直接報錯的。
很明顯,autoload無法滿足要求, 所以就有了SPL擴展,spl_autoload_register接受函數名或閉包,或數組作為參數,在閉包內部,即可引入對應的文件了。并且spl_autoload_register可以注冊一個 自動加載隊列,先注冊的,先調用。
參數 autoload_function 欲注冊的自動裝載函數。如果沒有提供任何參數,則自動注冊 autoload 的默認實現函數spl_autoload()。 throw 此參數設置了 autoload_function 無法成功注冊時, spl_autoload_register()是否拋出異常。 prepend 如果是 true,spl_autoload_register() 會添加函數到隊列之首,而不是隊列尾部。
可以結合require_once一起使用。如:
function_1(){ $clsName = str_replace("\\",DIRECTORY_SEPARATOR, $class_name); if (is_file(__DIR__.DIRECTORY_SEPARATOR."src".DIRECTORY_SEPARATOR.$clsName . '.php')) { //文件內部有類名 為 TestClass_1的類 require_once(__DIR__.DIRECTORY_SEPARATOR."src".DIRECTORY_SEPARATOR.$clsName.'.php'); } } function_2(){ $clsName = str_replace("\\",DIRECTORY_SEPARATOR, $class_name); if (is_file(__DIR__.DIRECTORY_SEPARATOR."Module".DIRECTORY_SEPARATOR.$clsName . '.php')) { //文件內部有類名為TestClass_2的類 require_once(__DIR__.DIRECTORY_SEPARATOR."Module".DIRECTORY_SEPARATOR.$clsName.'.php'); } } spl_autoload_register('function_1'); spl_autoload_register('function_2'); $obj = new TestClass_2(); //當前沒有TestClass_2這個類,于是自動調用function_1, 引入了文件,但是引入的文件中仍然沒有TestClass_2這個類,于是又自動調用function_2, 引入了文件,此時正常初始化
該函數是需要用戶顯示調用所有已注冊的 autoload函數的。 作用在 spl_autoload_register之后。 傳入函數名字即可。即可手動引入文件了。
可以獲取到所有已經注冊的autoload函數, 也是作用在 spl_autoload_register之后的。
注冊并返回spl_autoload函數使用的默認文件擴展名, 但是此接口和spl_autoload函數,用處不大。spl_autoload 是autoload的默認實現,意思就是spl_autoload對autoload進行了又一次封裝,在默認情況下,本函數先將類名轉換成小寫,再在小寫的類名后加上 .inc 或 .php 的擴展名作為文件名,然后在所有的包含路徑(include paths)中檢查是否存在該文件。
__autoload 函數是用來處理自動加載的函數,在 PHP 找不到指定類時就會去調用自動加載類,加載所需要的類。 __autoload 只是一個抽象定義,實現(實現就是定義如何加載,加載的規則是什么,加載的文件是什么等等)是交給用戶的,而 spl_autoload 則是 SPL 所定義的 autoload 一種實現。spl_autoload 函數所實現的加載規則就是去 include paths 中查找對于的類。spl_autoload 遵循是是 psr-0 的載入規則,而 include paths 就是載入時被查詢的路徑。 其他自己實現的 autoload 類都可以通過 spl_autoload_register 進行注冊,注冊之后就可以在需要類時自動調用被注冊的方法進行加載了。 spl_autoload 也是 autoload 的一種實現,按理也是需要注冊的,只不過因為是內部的默認實現,所有已經自動注冊在 PHP 里了。
spl_autoload 如今來看并沒有太多用處,應該是因為歷史問題殘留在 PHP 中的,目前絕大多數程序都沒有使用 spl_autoload 去做自動加載,因為它的規則已經定死,并不適合衍生一些功能。
因為 PHP 只有一個自動加載方法,所以 SPL 的 spl_autoload 和 spl_autoload_register 要爭搶這個方法,所以在 SPL 的 C 實現中,用了好多折衷的辦法。在沒有使用 spl_autoload_register 注冊任何自定的自動加載函數時, PHP 的自動加載方法是掛在 spl_autoload 下的,而 spl_autoload_register 注冊了自動加載函數后,PHP 的自動加載方法是掛在 spl_autoload_call 這個方法下的,而 spl_autoload 也會成為一個備選項進入 spl_autoload_register 的自動加載隊列。
到此,相信大家對“PHP SPL擴展庫的使用方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。