程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> Zend_Loader_Autoloader是如何工作的

Zend_Loader_Autoloader是如何工作的

編輯:關於PHP編程

自動加載的原理是Zend_Application實例了Zend_Loader_Autoloader,使其調用了spl_autoload_register(array(__CLASS__, 'autoload')); 這樣如果找不到的類就會調用此對象的autoload方法進行處理。

一個名稱空間可以有多個加載器,迭代找出符合的自定義加載器後,其余的就不會使用了,一般我們只會針對一個名稱空間注冊一個自定義加載器或者直接使用默認的加載器。

注冊名稱空間方式分為兩種:

  • 只注冊了空間的前辍,沒有指定任何加載器,注冊方法為registerNamespace('空間名稱')。
  • 注冊了空間前辍,並指定了加載器。注冊方法為pushAutoloader(加載器,'空間名稱')或unshiftAutoloader(加載器,'空間名稱')兩個方法的區別是push將加載器放到指定空間名稱的加載器隊列之後,unshift是之前。

當一個類沒有找到並要求載入時,其類名交給Zend_Loader_Autoloader::autoload()處理,會經歷以下幾個過程:

  • 用已經注冊名稱空間前辍和此類名進行對比,找出名稱空間指定的加載器。
    1. 用名稱空間注冊方式第二種名稱前辍和此類名前辍進行對比,找出名稱空間指定的加載器。
    2. 用名稱空間注冊方式第一種名稱前辍和此類名前辍進行對比,如果存在則用Zend的加載器。
    3. 如果沒有任何名稱空間前辍和此類相等,而確設置了FallbackAutoloader標志則也使用Zend的加載器,否則不返回任何加載器,此類也就不能被載入了。
  • 如果加載器是實現了Zend_Loader_Autoloader_Interface接口的類則將類名傳給其autoload方法進行加載,如果加載器是一個函數則將類名當做此函數的參數進行加載。如果加載器是一個數組則用call_user_func回調函數進行加載。

自定義的加載器有以下幾種形式:

  1. 一個實現了Zend_Loader_Autoloader_Interface接口的對象
  2. $autoloader = Zend_Loader_Autoloader::getInstance();
    $myAutoloaderClass = new my_Autoloader();
    $autoloader->pushAutoloader($myAutoloaderClass, myNamespace);
    
  3. 一個函數
  4. $autoloader = Zend_Loader_Autoloader::getInstance();
    function myAutoloaderFun(){ //TODO };
    $autoloader->pushAutoloader('myAutoloaderFun', myNamespace);
    
  5. 以回調方式(callback)調用一個對象或類的方法.(回掉函數call_user_func)
  6. $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader->pushAutoloader(array('類名', '方法'), myNamespace);
    

Zend加載器對象方法是Zend_Loader_Autoloader::_autoload。此方法會用call_user_func調用最終的加載方法如默認為array('Zend_Loader', 'loadClass')對當前對象進行加載。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved