深刻理解自動加載(一)

自動加載是一個很是核心的功能。在沒有自動加載的時候,引用某個文件,經常須要一個很長的列表(須要把用到的)。
先用一個簡單的樣例:__autoload()  能夠作到當在實例化某個沒有的類的時候,會自動加載讀取到的沒有加載的文件名。須要保持文件名和類名是一致的
寫倆個文件 一個 in.php
php

<?php
class  in  {
  public  function  test() {
       echo  '123';
  }
   public  function test2() {
        echo   "456";
   }
}
?>

另一個文件index.php
函數

<?php
function  __autoload($class){
    require   $class.".php";
}
$a = new in();
$a->test();
?>

可是__autoload函數只能用一次,當倆個項目合在一塊兒的時候,只有一個會生效,另一個沒法使用。因而增長了SPL函數
spl_autoload_register();
能夠同時加載N種自動加載規則,最經常使用的,重改index.php有
ui

function load($class){
 include $class.".php";
}
spl_autoload_register("load");
new in();

自動加載雖然很好用,可是到了PHP5.3之後,引入了命名空間namespace後,自動加載的複雜度又獲得了提高。這裏先介紹下PHP5.3的命名空間新概念:命名空間一個最明確的目的就是解決重名問題,PHP中不容許兩個函數或者類出現相同的名字,不然會產生一個致命的錯誤。這種狀況下只要避免命名重複就能夠解決,最多見的一種作法是約定一個前綴。可是約定前綴,會帶來大量的額外代碼。報告裏的評論和文章裏的評論可能都有comment,Article和Board都有這個函數,因而要進行各自約定Article_comment,Board_comment當大量這樣進行約定進行調用的時候,會很是麻煩,因而出現了命名空間。
調用的時候,只須要命名空間就能夠約定 見下列示例
spa

namespace  test\index;
class  test1 {
    public   function   a() {
          echo   "a";
    }
}
  function  b() {
      return   7;
   }
namespace  test\test;
function  b() {
      return   5;
   }
 echo   \test\index\b();

  在namespace  test\test的空間裏,調用test\index空間裏的方法相似於寫目錄的方法。自動加載進行解析的時候,就須要進行一些靈活的變更。
  命名空間和文件引用沒有必然關係,可是在解析的時候,會遇到一個比較複雜的判斷狀況。
code

相關文章
相關標籤/搜索