1. 程式人生 > >13:類的自動載入

13:類的自動載入

類的自動載入

  • 當你在某個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的實現方法
  • 按照註冊的先後順序進行載入;