13:類的自動載入
阿新 • • 發佈:2018-12-24
類的自動載入
-
當你在某個PHP檔案中去使用一個你不確定的類的時候,你無法確定包含這個類的外部檔案是否被引用
-
Once函式效率又很低
-
請使用
__autoload($className)
函式,當你引用的類不存在的時候,你可以在這個函式中去引用包含檔案- 這個函式是當你引用一個不存在的類時,系統給你一次在報錯之前進行處理的機會
- 也就是說這個函式觸發的時機是,類不存在–》執行__autoload函式–》報錯
- 這個函式接受一個引數,這個引數是你引用的而不存在的類名
-
示例:
$a = new moudle1(); function __autoload($className){ include('/module/' . $className . '.php'); }
- 當例項化moudle1這個類時,到這一行,肯定是要報錯的,如果沒有其他的處理方法
- 當判斷當前頁面無此類時,而也沒有那麼引入的檔案有這個類,則進入__autoload函式中,此時,你可以引用與之對應的檔案,當然這個就看你自己的命名了;
- 類宣告全域性有效,不管是在多深的作用域中
自定載入函式換個名字
spl_autoload_register
,註冊給定的函式作為__autoload函式的實現;- 上面這句話就是說,註冊一個函式,作為__autoload函式的替換,就是換個名字;
- 他還有兩個引數,具體的請翻閱PHP手冊;
- 靜態方法也可以作為自動載入方法,示例:
class Say{
static function zidongjiazai($class){
echo $class;
}
}
spl_autoload_register(array('Say','zidongjiazai'));
spl_autoload_register('Say::zidongjiazai');
new C();
- 如果用類的話,則方法必須是靜態的;
自動載入的應用場景
- 例如你可以做一個檔案自動載入的系統
- 只要規定好PHP檔名,比如類檔案,模型檔案,模組檔案,元件檔案,分別命名成不同的單詞
- 如果檔名中存在某個型別檔案的關鍵詞,那就去這個對應的目錄下去載入,就不用在每個檔案裡都去手動載入檔案了;
__autoload
函式不能被重複定義,所以當你想對不同型別檔案進行目錄上的不同引用,你可以寫if…else…,但是更好的方法是,你可以實用spl_autoload_register
函式去註冊多個__autoload的實現方法- 按照註冊的先後順序進行載入;