有A類和B類,如果在A類實例化B類,最簡單直接的方法就是在B中使用include require_once A的文件,但是這種方法顯然是不友好的,在框架中葉不是這么做的,在框架中使用的是自動加載的機制也成為懶加載。
php中自動加載使用spl_autoload_register來完成在沒有指定類的情況下自動加載的動作,有了這個方法在new一個類之前,就算沒有引入這個類的文件,也能正確初始化指定類,這樣我們就不用使用include require_once來引入文件,其實這個方法就是對include方法的封裝,同時需要自己實現。下面舉個🌰,並說明其原理
下面這段是autolod.php的源碼:
1 <?php 2 spl_autoload_register(array('autoload','load')); 3 class autoload{ 4 public static function load($classnName){ 5 if ( !class_exists($classnName) ) { 6 $file = $classnName.'.php'; 7 require_once('./'.$file); 8 9 } 10 } 11 } 12 $class = new autoload_test(); 13 $class->test();
下面這段是autolod_test.php的源碼:
1 <?php 2 class autoload_test{ 3 function test(){ 4 echo 'this is test'; 5 } 6 }
代碼很簡單,但是足以說明spl_autoload_register自動加載的機制,在代碼執行的過程中,當new一個未包含的類的時候,php會去執行spl_autoload_register中的第一個參數,就是需要new的類名,這個函數的功能就是把沒有引入的類引入進來,但是有個前提就是類的名字和文件的名字要一致,這樣就實現了自動加載的功能,是不是很簡單。
spl_autoload_register這個方法還有另一種常用的調用方式spl_autoload_register(array($className,$functionName));使用指定的類中的靜態方法去完成自動加載,靜態方法里面的結構就是完成autoload里面的邏輯。