Zend的AutoLoad機(jī)制介紹
更新時(shí)間:2012年09月27日 16:05:43 作者:
在使用zend framework的時(shí)候,最先引入的一定是AutoLoad的機(jī)制,這里就想分析下Zend的AutoLoad是怎么引入的
代碼示例
set_include_path(USVN_LIB_DIR . PATH_SEPARATOR . get_include_path());
require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->registerNamespace("Zend_");
$autoloader->registerNamespace("USVN_");
$autoloader->registerNamespace("menus_");
$config = new USVN_Config_Ini(USVN_CONFIG_FILE, USVN_CONFIG_SECTION);
過程分析
首先是設(shè)置了include_path,include_path就是php中調(diào)用include的時(shí)候文件尋找的地址
下面就是 require_once 'Zend/Loader/Autoloader.php';
在Zend/Loader/Autoloader.php文件內(nèi),讀入了Zend/Loader.php, 這個(gè)php定義了Zend_Loader這個(gè)類,這個(gè)類包含了loadClass,loadFile, isReadable(文件是否可讀)等函數(shù)
實(shí)例化Zend_Loader_Autoloader的過程就是調(diào)用其構(gòu)造函數(shù)(這里是使用了單例模式)的過程
它的構(gòu)造函數(shù)中的spl_autoload_register(array(__CLASS__, 'autoload'));將Zend_Loader_Autoloader:autoload作為類自動(dòng)加載函數(shù)。
還做了一個(gè)操作將_internalAutoloader賦值了自身的_autoload
至于這里面是怎么autoload的等會(huì)根據(jù)具體例子查看
接下來調(diào)用了Zend_Loader_Autoloader:registerNamespace("USVN_"),這個(gè)函數(shù)做的事就只是在Zend_Loader_AutoLoader的內(nèi)部屬性_namespaces上掛載一個(gè)key為USVN_和value為true的值。
看到這個(gè)函數(shù)就明白其實(shí)代碼也可以寫成
$autoloader->registerNamespace("Zend_")->registerNamespace("USVN_")
或者
$autoloader->registerNamespace(array("Zend_","USVN_"))
好了,現(xiàn)在到調(diào)用 USVN_Config_Ini類了
這個(gè)類自然走的就是Zend_Loader_Autoloader:autoload("USVN_Config_Ini")
這個(gè)函數(shù)第一步會(huì)去調(diào)用getClassAutoloaders獲取這個(gè)類的AutoLoader。getClassAutoloaders里面增加了對(duì)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 )
其實(shí)就是前面設(shè)置的_internalAutoloader。
這里就會(huì)實(shí)際調(diào)用Zend_Loader_Autoloader:_autoload ("USVN_Config_Ini")
好了,現(xiàn)在就看到了Zend_Loader_Autoloader:_autoload函數(shù)
$callback = $this->getDefaultAutoloader();
這里會(huì)獲取默認(rèn)的Autoloader,什么是默認(rèn)的Autoloader? 看這個(gè)類初始定義,實(shí)際上是array('Zend_Loader', 'loadClass');
下面自然就調(diào)用的是call_user_func($callback, $class);即Zend_Loader:loadClass("USVN_Config_Ini")
首先Zend_Loader已經(jīng)在AutoLoader.php中被require了
其次我們看看Zend_Loader:loadClass方法,這個(gè)方法第一步是檢查異常,跳過。第二步是將類分隔,拼湊成$file, 比如USVN/Config/Ini.php,下面就直接調(diào)用self::loadFile($file, null, true);
接下來查看self::loadFile,
首先_securityCheck看類名中是否有非法字符,沒有,就include了這個(gè)$file。這里的$file當(dāng)然是相對(duì)路徑,需要拼接上include_path, 記得include_path是在哪里設(shè)置的嗎?在程序的一開始就設(shè)置了!好了,這里就把USVN_Config_Ini這個(gè)類讀取進(jìn)來了。
看到這里你就該明白了,如果你自己定義了一個(gè)類,并且注冊(cè)了Namespace,比如USVN,那么你就應(yīng)該在include_path下面創(chuàng)建一個(gè)同名文件夾(大小寫必須區(qū)分),然后你要引入的相對(duì)的文件路徑名就是以類名的_做分隔讀入的。
到這里AutoLoad機(jī)制就閱讀完了。
復(fù)制代碼 代碼如下:
set_include_path(USVN_LIB_DIR . PATH_SEPARATOR . get_include_path());
require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->registerNamespace("Zend_");
$autoloader->registerNamespace("USVN_");
$autoloader->registerNamespace("menus_");
$config = new USVN_Config_Ini(USVN_CONFIG_FILE, USVN_CONFIG_SECTION);
過程分析
首先是設(shè)置了include_path,include_path就是php中調(diào)用include的時(shí)候文件尋找的地址
下面就是 require_once 'Zend/Loader/Autoloader.php';
在Zend/Loader/Autoloader.php文件內(nèi),讀入了Zend/Loader.php, 這個(gè)php定義了Zend_Loader這個(gè)類,這個(gè)類包含了loadClass,loadFile, isReadable(文件是否可讀)等函數(shù)
實(shí)例化Zend_Loader_Autoloader的過程就是調(diào)用其構(gòu)造函數(shù)(這里是使用了單例模式)的過程
它的構(gòu)造函數(shù)中的spl_autoload_register(array(__CLASS__, 'autoload'));將Zend_Loader_Autoloader:autoload作為類自動(dòng)加載函數(shù)。
還做了一個(gè)操作將_internalAutoloader賦值了自身的_autoload
至于這里面是怎么autoload的等會(huì)根據(jù)具體例子查看
接下來調(diào)用了Zend_Loader_Autoloader:registerNamespace("USVN_"),這個(gè)函數(shù)做的事就只是在Zend_Loader_AutoLoader的內(nèi)部屬性_namespaces上掛載一個(gè)key為USVN_和value為true的值。
看到這個(gè)函數(shù)就明白其實(shí)代碼也可以寫成
$autoloader->registerNamespace("Zend_")->registerNamespace("USVN_")
或者
$autoloader->registerNamespace(array("Zend_","USVN_"))
好了,現(xiàn)在到調(diào)用 USVN_Config_Ini類了
這個(gè)類自然走的就是Zend_Loader_Autoloader:autoload("USVN_Config_Ini")
這個(gè)函數(shù)第一步會(huì)去調(diào)用getClassAutoloaders獲取這個(gè)類的AutoLoader。getClassAutoloaders里面增加了對(duì)namespaceAutoloader的選擇和判斷,由于我們很少使用,直接跳過
這里返回的loader打印出來是這樣的
復(fù)制代碼 代碼如下:
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 )
其實(shí)就是前面設(shè)置的_internalAutoloader。
這里就會(huì)實(shí)際調(diào)用Zend_Loader_Autoloader:_autoload ("USVN_Config_Ini")
好了,現(xiàn)在就看到了Zend_Loader_Autoloader:_autoload函數(shù)
$callback = $this->getDefaultAutoloader();
這里會(huì)獲取默認(rèn)的Autoloader,什么是默認(rèn)的Autoloader? 看這個(gè)類初始定義,實(shí)際上是array('Zend_Loader', 'loadClass');
下面自然就調(diào)用的是call_user_func($callback, $class);即Zend_Loader:loadClass("USVN_Config_Ini")
首先Zend_Loader已經(jīng)在AutoLoader.php中被require了
其次我們看看Zend_Loader:loadClass方法,這個(gè)方法第一步是檢查異常,跳過。第二步是將類分隔,拼湊成$file, 比如USVN/Config/Ini.php,下面就直接調(diào)用self::loadFile($file, null, true);
接下來查看self::loadFile,
首先_securityCheck看類名中是否有非法字符,沒有,就include了這個(gè)$file。這里的$file當(dāng)然是相對(duì)路徑,需要拼接上include_path, 記得include_path是在哪里設(shè)置的嗎?在程序的一開始就設(shè)置了!好了,這里就把USVN_Config_Ini這個(gè)類讀取進(jìn)來了。
看到這里你就該明白了,如果你自己定義了一個(gè)類,并且注冊(cè)了Namespace,比如USVN,那么你就應(yīng)該在include_path下面創(chuàng)建一個(gè)同名文件夾(大小寫必須區(qū)分),然后你要引入的相對(duì)的文件路徑名就是以類名的_做分隔讀入的。
到這里AutoLoad機(jī)制就閱讀完了。
您可能感興趣的文章:
- 說說PHP的autoLoad自動(dòng)加載機(jī)制
- PHP的autoload機(jī)制的實(shí)現(xiàn)解析
- PHP __autoload()方法真的影響性能嗎?
- php _autoload自動(dòng)加載類與機(jī)制分析
- PHP __autoload函數(shù)(自動(dòng)載入類文件)的使用方法
- PHP函數(shù)spl_autoload_register()用法和__autoload()介紹
- PHP spl_autoload_register實(shí)現(xiàn)自動(dòng)加載研究
- zend api擴(kuò)展的php對(duì)象的autoload工具
- PHP的autoload自動(dòng)加載機(jī)制使用說明
相關(guān)文章
如何讓thinkphp在模型中自動(dòng)完成session賦值小教程
在項(xiàng)目中遇到一個(gè)問題,需要讓thinkphp在模型中自動(dòng)完成session賦值,經(jīng)過一番研究,終于實(shí)現(xiàn),下面記錄一下,另附上thinkPHP的session的相關(guān)知識(shí)2014-09-09php驗(yàn)證手機(jī)號(hào)碼(支持歸屬地查詢及編碼為UTF8)
本文將實(shí)現(xiàn)以下功能:手機(jī)號(hào)驗(yàn)證/手機(jī)號(hào)碼歸屬地/轉(zhuǎn)換字符串編碼為UTF8,對(duì)此有興趣的朋友可以參考下,或許本文對(duì)你有所幫助2013-02-02PHP Session 變量的使用方法詳解與實(shí)例代碼
在php中Session經(jīng)常用來驗(yàn)證用戶注冊(cè)或登錄之后的驗(yàn)證了,下面我來總結(jié)session變量的一些常用實(shí)例與用法介紹2013-09-09