PHP自動(dòng)載入類文件函數(shù)__autoload的使用方法
開發(fā)面向?qū)ο蟮膽?yīng)用程序時(shí),往往要對(duì)每個(gè)類的定義建立一個(gè) PHP 源文件。這樣的做法產(chǎn)生的一個(gè)很大的煩惱就是不得不在每個(gè)腳本(每個(gè)類一個(gè)文件)開頭寫一個(gè)長(zhǎng)長(zhǎng)的包含文件的列表。
在PHP開發(fā)的系統(tǒng)中,當(dāng)在一個(gè)文件中需要調(diào)用另一個(gè)PHP文件中聲明的類時(shí),就需要通過(guò)include或require把這個(gè)文件引入。不過(guò)有的時(shí)候,在文件眾多的項(xiàng)目中,要一一將所需類的文件都包含進(jìn)來(lái),是一個(gè)讓人很頭疼的事,所以我們能不能在用到什么類的時(shí)候,再把這個(gè)類所在的php文件導(dǎo)入呢?這就是我們這里我們要講的自動(dòng)加載類。
在 PHP 5 中,可以定義一個(gè) __autoload()
函數(shù),它會(huì)在試圖使用尚未被定義的類時(shí)自動(dòng)調(diào)用,通過(guò)調(diào)用此函數(shù),腳本引擎在 PHP 出錯(cuò)失敗前有了最后一個(gè)機(jī)會(huì)加載所需的類, __autoload()函數(shù)接收的一個(gè)參數(shù),就是你想加載的類的類名,所以你做項(xiàng)目時(shí),在組織定義類的文件名時(shí),需要按照一定的規(guī)則,最好以類名為中心,也可以加上統(tǒng)一的前綴或后綴形成文件名,比如 xxx_classname.php
、classname_xxx.php
以及就是classname.php
等等。
我們以一個(gè)例子來(lái)說(shuō)明一下__autoload 的使用方法,下面分別從 ClassA.php 和 ClassB.php 文件中加載 ClassA 和 ClassB 類
<?php //定義一個(gè)類ClassA,文件名為ClassA.php class ClassA{ public function __construct(){ echo "ClassA load success!"; } } ?>
<?php //定義一個(gè)類ClassB,文件名為ClassB.php,ClassB繼承ClassA class ClassB extends ClassA { public function __construct(){ echo "ClassB load success!"; } } ?>
<?php function __autoload($classname) { $classpath="./".$classname.'.php'; if(file_exists($classpath)){ require_once($classpath); } else{ echo 'class file'.$classpath.'not found!'; } } //ClassA類不存在時(shí),自動(dòng)調(diào)用__autoload()函數(shù),傳入?yún)?shù)”ClassA” $obj = new ClassA(); //ClassB類不存在時(shí),自動(dòng)調(diào)用__autoload()函數(shù),傳入?yún)?shù)”ClassB” $obj2 = new ClassB(); ?>
能過(guò)上面的例子,我們發(fā)現(xiàn)在使用ClassA和ClassB時(shí),我們并沒(méi)有手動(dòng)引入ClassA.php和ClassB.php文件,但卻能正常使用這兩個(gè)類,可見(jiàn)__autoload是多么地好用。
但在使用__autoload時(shí)也要注意一些問(wèn)題,比如上面的ClassB類,它是繼承了ClassA類,如果這時(shí)ClassA和ClassB不在同一個(gè)目錄時(shí)就會(huì)出錯(cuò),所以建議把所有存在extends關(guān)系的類放在同一個(gè)文件目錄下,或者在實(shí)例化一個(gè)繼承類的時(shí)候在文件中手工包含被繼承的類。還有一點(diǎn)就是在使用自動(dòng)載入函數(shù)時(shí)一定要注意類名與文件名的對(duì)應(yīng)關(guān)系。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
實(shí)用的PHP帶公鑰加密類分享(每次加密結(jié)果都不一樣哦)
這篇文章主要介紹了實(shí)用的PHP帶公鑰加密類分享,本類實(shí)現(xiàn)每次的加密結(jié)果都不一樣,但解密沒(méi)有問(wèn)題,非常實(shí)用的一個(gè)加密類,需要的朋友可以參考下2014-08-08php文件服務(wù)實(shí)現(xiàn)虛擬掛載其他目錄示例
這篇文章主要介紹了php文件服務(wù)實(shí)現(xiàn)虛擬掛載其他目錄示例,需要的朋友可以參考下2014-04-04Yii2框架實(shí)現(xiàn)登錄、退出及自動(dòng)登錄功能的方法詳解
這篇文章主要介紹了Yii2框架實(shí)現(xiàn)登錄、退出及自動(dòng)登錄功能的方法,結(jié)合實(shí)例形式詳細(xì)分析了Yii2框架實(shí)現(xiàn)登錄、退出及自動(dòng)登錄功能的原理、實(shí)現(xiàn)方法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2017-10-10Laravel程序架構(gòu)設(shè)計(jì)思路之使用動(dòng)作類
這篇文章主要給大家介紹了關(guān)于Laravel程序架構(gòu)設(shè)計(jì)思路之使用動(dòng)作類的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06新浪SAE云平臺(tái)下使用codeigniter的數(shù)據(jù)庫(kù)配置
這篇文章主要介紹了新浪SAE云平臺(tái)下使用codeigniter的數(shù)據(jù)庫(kù)配置,主要涉及在database.php的配置,需要的朋友可以參考下2014-06-06利用yahoo匯率接口實(shí)現(xiàn)實(shí)時(shí)匯率轉(zhuǎn)換示例 匯率轉(zhuǎn)換器
這篇文章主要介紹了利用yahoo匯率接口實(shí)現(xiàn)實(shí)時(shí)匯率轉(zhuǎn)換示例,大家參考使用吧2014-01-01