Zend Framework中的AutoLoad機制_PHP教程

來源:互聯網
上載者:User
程式碼範例

 
  1. set_include_path(USVN_LIB_DIR . PATH_SEPARATOR . get_include_path());
  2. require_once 'Zend/Loader/Autoloader.php';
  3. $autoloader = Zend_Loader_Autoloader::getInstance();
  4. $autoloader->registerNamespace("Zend_");
  5. $autoloader->registerNamespace("USVN_");
  6. $autoloader->registerNamespace("menus_");
  7. $config = new USVN_Config_Ini(USVN_CONFIG_FILE, USVN_CONFIG_SECTION);

過程分析

首先是設定了include_path,include_path就是php中調用include的時候檔案尋找的地址

下面就是 require_once 'Zend/Loader/Autoloader.php';

在Zend/Loader/Autoloader.php檔案內,讀入了Zend/Loader.php, 這個php定義了Zend_Loader這個類,這個類包含了loadClass,loadFile, isReadable(檔案是否可讀)等函數執行個體化Zend_Loader_Autoloader的過程就是調用其建構函式(這裡是使用了單例模式)的過程它的建構函式中的spl_autoload_register(array(__CLASS__, 'autoload'));將Zend_Loader_Autoloader:autoload作為類自動載入函數。還做了一個操作將_internalAutoloader賦值了自身的_autoload

至於這裡面是怎麼autoload的等會根據具體例子查看

接下來調用了Zend_Loader_Autoloader:registerNamespace("USVN_"),這個函數做的事就只是在Zend_Loader_AutoLoader的內部屬性_namespaces上掛載一個key為USVN_和value為true的值。

看到這個函數就明白其實代碼也可以寫成

$autoloader->registerNamespace("Zend_")->registerNamespace("USVN_")

或者

$autoloader->registerNamespace(array("Zend_","USVN_"))

好了,現在到調用 USVN_Config_Ini類了

這個類自然走的就是Zend_Loader_Autoloader:autoload("USVN_Config_Ini")這個函數第一步會去調用getClassAutoloaders擷取這個類的AutoLoader。getClassAutoloaders裡面增加了對namespaceAutoloader的選擇和判斷,由於我們很少使用,直接跳過這裡返回的loader列印出來是這樣的

Array ( [0] => Zend_Loader_Autoloader Object ( [_autoloaders:protected] => Array ( ) [_defaultAutoloader:protected] => Array ( [0] => Zend_Loader [1] => loadClass ) [_fallbackAutoloader:protected] => [_internalAutoloader:protected] => Array *RECURSION* [_namespaces:protected] => Array ( [Zend_] => 1 [ZendX_] => 1 [USVN_] => 1 [menus_] => 1 ) [_namespaceAutoloaders:protected] => Array ( ) [_suppressNotFoundWarnings:protected] => [_zfPath:protected] => ) [1] => _autoload )

其實就是前面設定的_internalAutoloader。

這裡就會實際調用Zend_Loader_Autoloader:_autoload ("USVN_Config_Ini")

好了,現在就看到了Zend_Loader_Autoloader:_autoload函數

$callback = $this->getDefaultAutoloader();

這裡會擷取預設的Autoloader,什麼是預設的Autoloader? 看這個類初始定義,實際上是array('Zend_Loader', 'loadClass');

下面自然就調用的是call_user_func($callback, $class);即Zend_Loader:loadClass("USVN_Config_Ini")

首先Zend_Loader已經在AutoLoader.php中被require了

其次我們看看Zend_Loader:loadClass方法,這個方法第一步是檢查異常,跳過。第二步是將類分隔,拼湊成$file, 比如USVN/Config/Ini.php,下面就直接調用self::loadFile($file, null, true);

接下來查看self::loadFile,首先_securityCheck看類名中是否有非法字元,沒有,就include了這個$file。這裡的$file當然是相對路徑,需要拼接上include_path, 記得include_path是在哪裡設定的嗎?在程式的一開始就設定了!好了,這裡就把USVN_Config_Ini這個類讀取進來了。

看到這裡你就該明白了,如果你自己定義了一個類,並且註冊了Namespace,比如USVN,那麼你就應該在include_path下面建立一個同名檔案夾(大小寫必須區分),然後你要引入的相對的檔案路徑名就是以類名的_做分隔讀入的。

到這裡AutoLoad機制就閱讀完了。


http://www.bkjia.com/PHPjc/445667.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/445667.htmlTechArticle程式碼範例 set_include_path(USVN_LIB_DIR.PATH_SEPARATOR.get_include_path()); require_once 'Zend/Loader/Autoloader.php' ; $autoloader =Zend_Loader_Autoloader::getInstance(); $auto...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.