国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

PHP的autoload自動(dòng)加載機(jī)制使用說明

2024-05-04 23:06:00
字體:
供稿:網(wǎng)友

自PHP5后,引入了__autoload這個(gè)攔截器方法,可以自動(dòng)對(duì)class文件進(jìn)行包含引用,下面看具體的使用方法。
在PHP開發(fā)過程中,如果希望從外部引入一個(gè)class,通常會(huì)使用include和require方法,去把定義這個(gè)class的文件包含進(jìn)來,但是這樣可能會(huì)使得在引用文件的新腳本中,存在大量的include或require方法調(diào)用,如果一時(shí)疏忽遺漏則會(huì)產(chǎn)生錯(cuò)誤,使得代碼難以維護(hù)。

自PHP5后,引入了__autoload這個(gè)攔截器方法,可以自動(dòng)對(duì)class文件進(jìn)行包含引用,通常我們會(huì)這么寫:
 

function __autoload($className) { include_once $className . '.class.php'; } $user = new User(); 

當(dāng)PHP引擎試圖實(shí)例化一個(gè)未知類的操作時(shí),會(huì)調(diào)用__autoload()方法,在PHP出錯(cuò)失敗前有了最后一個(gè)機(jī)會(huì)加載所需的類。因此,上面的這段代碼執(zhí)行時(shí),PHP引擎實(shí)際上替我們自動(dòng)執(zhí)行了一次__autoload方法,將User.class.php這個(gè)文件包含進(jìn)來。

在__autoload函數(shù)中拋出的異常不能被catch語句塊捕獲并導(dǎo)致致命錯(cuò)誤。

如果使用 PHP的CLI交互模式時(shí),自動(dòng)加載機(jī)制將不會(huì)執(zhí)行。

當(dāng)你希望使用PEAR風(fēng)格的命名規(guī)則,例如需要引入U(xiǎn)ser/Register.php文件,也可以這么實(shí)現(xiàn):
 

//加載我 function __autoload($className) { $file = str_replace('_', DIRECTORY_SEPARATOR, $className); include_once $file . 'php'; } $userRegister = new User_Register(); 

這種方法雖然方便,但是在一個(gè)大型應(yīng)用中如果引入多個(gè)類庫的時(shí)候,可能會(huì)因?yàn)椴煌悗斓腶utoload機(jī)制而產(chǎn)生一些莫名其妙的問題。在PHP5引入SPL標(biāo)準(zhǔn)庫后,我們又多了一種新的解決方案,spl_autoload_register()函數(shù)。

此函數(shù)的功能就是把函數(shù)注冊(cè)至SPL的__autoload函數(shù)棧中,并移除系統(tǒng)默認(rèn)的__autoload()函數(shù)。一旦調(diào)用spl_autoload_register()函數(shù),當(dāng)調(diào)用未定義類時(shí),系統(tǒng)會(huì)按順序調(diào)用注冊(cè)到spl_autoload_register()函數(shù)的所有函數(shù),而不是自動(dòng)調(diào)用__autoload()函數(shù),下例調(diào)用的是User/Register.php而不是User_Register.class.php:
 

//不加載我 function __autoload($className) { include_once $className . '.class.php'; } //加載我 function autoload($className) { $file = str_replace('/', DIRECTORY_SEPARATOR, $className); include_once $file . '.php'; } //開始加載 spl_autoload_register('autoload'); $userRegister = new User_Register(); 

在使用spl_autoload_register()的時(shí)候,我們還可以考慮采用一種更安全的初始化調(diào)用方法,參考如下:
 

//系統(tǒng)默認(rèn)__autoload函數(shù) function __autoload($className) { include_once $className . '.class.php'; } //可供SPL加載的__autoload函數(shù) function autoload($className) { $file = str_replace('_', DIRECTORY_SEPARATOR, $className); include_once $file . '.php'; } //不小心加載錯(cuò)了函數(shù)名,同時(shí)又把默認(rèn)__autoload機(jī)制給取消了……囧 spl_autoload_register('_autoload', false); //容錯(cuò)機(jī)制 if(false === spl_autoload_functions()) { if(function_exists('__autoload')) { spl_autoload_register('__autoload', false); } } 

技巧:在Unix/Linux環(huán)境下,如果你有多個(gè)規(guī)模較小的類,為了管理方便,都寫在一個(gè)php文件中的時(shí)候,可以通過以ln -s命令做軟鏈接的方式快速分發(fā)成多個(gè)不同類名的拷貝,再通過autoload機(jī)制進(jìn)行加載。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 罗山县| 鄂温| 阜阳市| 镶黄旗| 汽车| 龙泉市| 南京市| 平乡县| 长顺县| 鸡西市| 乌审旗| 菏泽市| 海口市| 潍坊市| 浦北县| 周宁县| 淮安市| 合肥市| 景洪市| 京山县| 开封市| 盐边县| 眉山市| 西城区| 枣庄市| 湄潭县| 清徐县| 张家港市| 九龙县| 甘南县| 虹口区| 朔州市| 正定县| 柞水县| 垫江县| 井研县| 区。| 竹北市| 介休市| 尚义县| 哈密市|