php中spl_autoload詳解
SPL有兩個不同的函數(shù) spl_autoload, spl_autoload_call,通過將autoload_func指向這兩個不同的函數(shù)地址來實現(xiàn)不同的自動加載機(jī)制。
spl_autoload 是SPL實現(xiàn)的默認(rèn)的自動加載函數(shù),它的功能比較簡單。它可以接收兩個參數(shù),第一個參數(shù)是$class_name,表示類名,第二個參 數(shù)$file_extensions是可選的,表示類文件的擴(kuò)展名" title="擴(kuò)展名">擴(kuò)展名,可以在$file_extensions中指定多個擴(kuò)展名" title="擴(kuò)展名">擴(kuò)展名,護(hù)展名之間用分號隔開即 可;如果不指定的話,它將使用默認(rèn)的擴(kuò)展名" title="擴(kuò)展名">擴(kuò)展名.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差不多,不同的它可以指定多個擴(kuò)展名" title="擴(kuò)展名">擴(kuò)展名。
怎 樣讓spl_autoload自動起作用呢,也就是將autoload_func指向spl_autoload?答案是使用 spl_autoload_register函數(shù)。在PHP腳本中第一次調(diào)用spl_autoload_register()時不使用任何參數(shù),就可以將 autoload_func指向spl_autoload。
通過上面的說明我們知道,spl_autoload的功能比較簡單,而且它是在SPL擴(kuò)展中實現(xiàn)的,我們無法擴(kuò)充它的功能。如果想實現(xiàn)自己的更靈活的自動加載機(jī)制怎么辦呢?這時,spl_autoload_call函數(shù)閃亮登場了。
我 們先看一下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機(jī)制,并不能保證類就一定能正確的自動加載,關(guān)鍵還是要看你的自動加載函數(shù)如何實現(xiàn)。
在php5中的標(biāo)準(zhǔn)庫方法spl_autoload相當(dāng)于實現(xiàn)自己的__autoload
<?php
function __autoload($classname){
if(is_file($classname.'.php'){
include $classname.'.php';
} elseif(is_file($classname.'.inc'){
include $classname.'.inc';
}
}
它會在注冊目錄下自動尋找與$classname同名的.php/.inc文件。當(dāng)然,你也可以指定特定類型的文件,方法是注冊擴(kuò)展名
<?php
spl_autoload_extensions('.php,.inc,.some');
這樣,它也會搜索.some文件。默認(rèn),php是不會啟動spl_autoload的,那么怎樣才能自動讓spl_autoload生效呢呢?方法是
<?php
spl_autoload_register();
spl_autoload_register有一個$callback參數(shù),如果不指定,它就會自動注冊spl_autoload,為了能搜尋更多的自動加載目錄,可以在這些代碼前面設(shè)置自動加載目錄
<?php
set_include_path(get_include_path() . PATH_SEPARATOR . 'some/path' . DIRECTORY_SEPARATOR);
這樣,當(dāng)php找不到指定的類時,就會在set_include_path指定的目錄下尋找。
這些方法常用在php框架中。比如把上面的介紹串連起來:
<?php
set_include_path(get_include_path() . PATH_SEPARATOR . 'some/path' . DIRECTORY_SEPARATOR);
spl_autoload_extensions('.php,.inc,.some');
spl_autoload_register();
當(dāng)你要加載some/path下面的classA類時,它會在目錄下尋找classa.php或classa.inc或classa.some,這樣你就可以放心地運(yùn)用new classA或extends classA
<?php
ClassB extends ClassA {
// code..
}
$a = new ClassA;
$b = new ClassB;
相關(guān)文章
PHP入門教程之日期與時間操作技巧總結(jié)(格式化,驗證,獲取,轉(zhuǎn)換,計算等)
這篇文章主要介紹了PHP入門教程之日期與時間操作技巧,結(jié)合實例形式總結(jié)分析了php針對日期與時間的驗證、格式化、獲取、轉(zhuǎn)換、計算等相關(guān)操作技巧,需要的朋友可以參考下2016-09-09php中修改瀏覽器的User-Agent來偽裝你的瀏覽器和操作系統(tǒng)
修改瀏覽器的User-Agent來偽裝你的瀏覽器和操作系統(tǒng),這兩種都可以得到User-Agents和IP等信息,最好配合正則表達(dá)式,對信息進(jìn)行篩選剔除。2011-07-07PHP使用自定義key實現(xiàn)對數(shù)據(jù)加密解密的方法
這篇文章主要介紹了PHP使用自定義key實現(xiàn)對數(shù)據(jù)加密解密的方法,涉及php針對字符串的轉(zhuǎn)換、截取等操作實現(xiàn)加密解密功能的相關(guān)技巧,需要的朋友可以參考下2017-12-12PHP preg_match實現(xiàn)正則表達(dá)式匹配功能【輸出是否匹配及匹配值】
這篇文章主要介紹了PHP preg_match實現(xiàn)正則表達(dá)式匹配功能,較為詳細(xì)的介紹了preg_match函數(shù)的功能、參數(shù)含義、返回值及使用方法,并結(jié)合實例給出了preg_match輸出是否匹配及匹配值的相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2017-07-07PHP中mysqli_affected_rows作用行數(shù)返回值分析
這篇文章主要介紹了PHP中mysqli_affected_rows作用行數(shù)返回值,實例分析了普通模式與oop模式的用法,具有一定的參考借鑒價值,需要的朋友可以參考下2014-12-12PHP使用內(nèi)置dir類實現(xiàn)目錄遍歷刪除
這篇文章主要介紹了PHP使用內(nèi)置dir類實現(xiàn)目錄遍歷刪除的方法,涉及php中dir類的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03