《PHP編程:php中spl_autoload詳解》要點:
本文介紹了PHP編程:php中spl_autoload詳解,希望對您有用。如果有疑問,可以聯(lián)系我們。
SPL有兩個分歧的函數(shù) spl_autoload, spl_autoload_call,通過將autoload_func指向這兩個分歧的函數(shù)地址來實現(xiàn)分歧的自動加載機制.PHP實例
spl_autoload 是SPL實現(xiàn)的默認的自動加載函數(shù),它的功能比擬簡單.它可以接收兩個參數(shù),第一個參數(shù)是$class_name,表示類名,第二個參 數(shù)$file_extensions是可選的,表示類文件的擴展名" title="擴展名">擴展名,可以在$file_extensions中指定多個擴展名" title="擴展名">擴展名,護展名之間用分號隔開即 可;如果不指定的話,它將使用默認的擴展名" title="擴展名">擴展名.inc或.php.spl_autoload首先將$class_name變?yōu)樾?然后在所有的 include path中搜索$class_name.inc或$class_name.php文件(如果不指定$file_extensions參數(shù)的話),如果找 到,就加載該類文件.你可以手動使用spl_autoload(”Person”, “.class.php”)來加載Person類.實際上,它跟require/include差不多,不同的它可以指定多個擴展名" title="擴展名">擴展名.PHP實例
怎 樣讓spl_autoload自動起作用呢,也便是將autoload_func指向spl_autoload?答案是使用 spl_autoload_register函數(shù).在PHP腳本中第一次調(diào)用spl_autoload_register()時不使用任何參數(shù),就可以將 autoload_func指向spl_autoload.PHP實例
通過上面的說明我們知道,spl_autoload的功能比較簡單,而且它是在SPL擴展中實現(xiàn)的,我們無法擴充它的功能.如果想實現(xiàn)本身的更靈活的自動加載機制怎么辦呢?這時,spl_autoload_call函數(shù)閃亮登場了.PHP實例
我 們先看一下spl_autoload_call的實現(xiàn)有何奧妙之處.在SPL模塊內(nèi)部,有一個全局變量autoload_functions,它本質(zhì)上是 一個HashTable,不過我們可以將其簡單的看作一個鏈表,鏈表中的每一個元素都是一個函數(shù)指針,指向一個具有自動加載類功能的函數(shù). spl_autoload_call本身的實現(xiàn)很簡單,只是簡單的按順序執(zhí)行這個鏈表中每個函數(shù),在每個函數(shù)執(zhí)行完成后都判斷一次需要的類是否已經(jīng)加載, 如果加載成功就直接返回,不再繼續(xù)執(zhí)行鏈表中的其它函數(shù).如果這個鏈表中所有的函數(shù)都執(zhí)行完成后類還沒有加載,spl_autoload_call就直接 退出,并不向用戶報告錯誤.因此,使用了autoload機制,并不能保證類就一定能正確的自動加載,關(guān)鍵還是要看你的自動加載函數(shù)如何實現(xiàn).PHP實例
在php5中的標(biāo)準(zhǔn)庫辦法spl_autoload相當(dāng)于實現(xiàn)自己的__autoloadPHP實例
它會在注冊目錄下自動尋找與$classname同名的.php/.inc文件.當(dāng)然,你也可以指定特定類型的文件,辦法是注冊擴展名PHP實例
這樣,它也會搜索.some文件.默認,php是不會啟動spl_autoload的,那么怎樣才能自動讓spl_autoload生效呢呢?辦法是PHP實例
spl_autoload_register有一個$callback參數(shù),如果不指定,它就會自動注冊spl_autoload,為了能搜尋更多的自動加載目次,可以在這些代碼前面設(shè)置自動加載目次PHP實例
這樣,當(dāng)php找不到指定的類時,就會在set_include_path指定的目次下尋找.PHP實例
這些辦法常用在php框架中.比如把上面的介紹串連起來:PHP實例
當(dāng)你要加載some/path下面的classA類時,它會在目錄下尋找classa.php或classa.inc或classa.some,這樣你就可以寧神地運用new classA或extends classAPHP實例
??? $a = new ClassA;
??? $b = new ClassB;
PHP實例
《PHP編程:php中spl_autoload詳解》是否對您有啟發(fā),歡迎查看更多與《PHP編程:php中spl_autoload詳解》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/14528.html