php中spl_autoload詳解
來源:易賢網(wǎng) 閱讀:597 次 日期:2014-10-30 08:33:08
溫馨提示:易賢網(wǎng)小編為您整理了“php中spl_autoload詳解”,方便廣大網(wǎng)友查閱!

spl_autoload 是SPL實(shí)現(xiàn)的默認(rèn)的自動(dòng)加載函數(shù),它的功能比較簡單。它可以接收兩個(gè)參數(shù),第一個(gè)參數(shù)是$class_name,表示類名,第二個(gè)參 數(shù)$file_extensions是可選的,表示類文件的擴(kuò)展名" title="擴(kuò)展名">擴(kuò)展名,可以在$file_extensions中指定多個(gè)擴(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ù)的話),如果找 到,就加載該類文件。你可以手動(dòng)使用spl_autoload(”Person”, “.class.php”)來加載Person類。實(shí)際上,它跟require/include差不多,不同的它可以指定多個(gè)擴(kuò)展名" title="擴(kuò)展名">擴(kuò)展名。

怎 樣讓spl_autoload自動(dòng)起作用呢,也就是將autoload_func指向spl_autoload?答案是使用 spl_autoload_register函數(shù)。在PHP腳本中第一次調(diào)用spl_autoload_register()時(shí)不使用任何參數(shù),就可以將 autoload_func指向spl_autoload。

通過上面的說明我們知道,spl_autoload的功能比較簡單,而且它是在SPL擴(kuò)展中實(shí)現(xiàn)的,我們無法擴(kuò)充它的功能。如果想實(shí)現(xiàn)自己的更靈活的自動(dòng)加載機(jī)制怎么辦呢?這時(shí),spl_autoload_call函數(shù)閃亮登場了。

我 們先看一下spl_autoload_call的實(shí)現(xiàn)有何奇妙之處。在SPL模塊內(nèi)部,有一個(gè)全局變量autoload_functions,它本質(zhì)上是 一個(gè)HashTable,不過我們可以將其簡單的看作一個(gè)鏈表,鏈表中的每一個(gè)元素都是一個(gè)函數(shù)指針,指向一個(gè)具有自動(dòng)加載類功能的函數(shù)。 spl_autoload_call本身的實(shí)現(xiàn)很簡單,只是簡單的按順序執(zhí)行這個(gè)鏈表中每個(gè)函數(shù),在每個(gè)函數(shù)執(zhí)行完成后都判斷一次需要的類是否已經(jīng)加載, 如果加載成功就直接返回,不再繼續(xù)執(zhí)行鏈表中的其它函數(shù)。如果這個(gè)鏈表中所有的函數(shù)都執(zhí)行完成后類還沒有加載,spl_autoload_call就直接 退出,并不向用戶報(bào)告錯(cuò)誤。因此,使用了autoload機(jī)制,并不能保證類就一定能正確的自動(dòng)加載,關(guān)鍵還是要看你的自動(dòng)加載函數(shù)如何實(shí)現(xiàn)。

在php5中的標(biāo)準(zhǔn)庫方法spl_autoload相當(dāng)于實(shí)現(xiàn)自己的__autoload

代碼如下:

<?php

function __autoload($classname){

if(is_file($classname.'.php'){

include $classname.'.php';

} elseif(is_file($classname.'.inc'){

include $classname.'.inc';

}

}

它會(huì)在注冊目錄下自動(dòng)尋找與$classname同名的.php/.inc文件。當(dāng)然,你也可以指定特定類型的文件,方法是注冊擴(kuò)展名

代碼如下:

<?php

spl_autoload_extensions('.php,.inc,.some');

這樣,它也會(huì)搜索.some文件。默認(rèn),php是不會(huì)啟動(dòng)spl_autoload的,那么怎樣才能自動(dòng)讓spl_autoload生效呢呢?方法是

代碼如下:

<?php

spl_autoload_register();

spl_autoload_register有一個(gè)$callback參數(shù),如果不指定,它就會(huì)自動(dòng)注冊spl_autoload,為了能搜尋更多的自動(dòng)加載目錄,可以在這些代碼前面設(shè)置自動(dòng)加載目錄

代碼如下:

<?php

set_include_path(get_include_path() . PATH_SEPARATOR . 'some/path' . DIRECTORY_SEPARATOR);

這樣,當(dāng)php找不到指定的類時(shí),就會(huì)在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類時(shí),它會(huì)在目錄下尋找classa.php或classa.inc或classa.some,這樣你就可以放心地運(yùn)用new classA或extends classA

代碼如下:

<?php

ClassB extends ClassA {

// code..

}

$a = new ClassA;

$b = new ClassB;

更多信息請查看IT技術(shù)專欄

更多信息請查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:php中spl_autoload詳解
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國考·省考課程試聽報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)