国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

zend framework引入AutoLoad機制

2020-03-22 20:27:23
字體:
供稿:網(wǎng)友
  • 在使用zend framework的時候,最先引入的一定是AutoLoad的機制,這里就想分析下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的時候文件尋找的地址

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

    在Zend/Loader/Autoloader.php文件內(nèi),讀入了Zend/Loader.php, 這個php定義了Zend_Loader這個類,這個類包含了loadClass,loadFile, isReadable(文件是否可讀)等函數(shù)

    實例化Zend_Loader_Autoloader的過程就是調(diào)用其html' target='_blank'>構(gòu)造函數(shù)(這里是使用了單例模式)的過程

    它的構(gòu)造函數(shù)中的spl_autoload_register(array(__CLASS__, 'autoload'));將Zend_Loader_Autoloader:autoload作為類自動加載函數(shù)。

    還做了一個操作將_internalAutoloader賦值了自身的_autoload

    至于這里面是怎么autoload的等會根據(jù)具體例子查看

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

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

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

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

    好了,現(xiàn)在到調(diào)用 USVN_Config_Ini類了

    這個類自然走的就是Zend_Loader_Autoloader:autoload("USVN_Config_Ini")

    這個函數(shù)第一步會去調(diào)用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 )

    其實就是前面設(shè)置的_internalAutoloader。

    這里就會實際調(diào)用Zend_Loader_Autoloader:_autoload ("USVN_Config_Ini")

    好了,現(xiàn)在就看到了Zend_Loader_Autoloader:_autoload函數(shù)

    www.it165.net

    $callback = $this->getDefaultAutoloader();

    這里會獲取默認的Autoloader,什么是默認的Autoloader? 看這個類初始定義,實際上是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方法,這個方法第一步是檢查異常,跳過。第二步是將類分隔,拼湊成$file, 比如USVN/Config/Ini.php,下面就直接調(diào)用self::loadFile($file, null, true);

    接下來查看self::loadFile,

    首先_securityCheck看類名中是否有非法字符,沒有,就include了這個$file。這里的$file當(dāng)然是相對路徑,需要拼接上include_path, 記得include_path是在哪里設(shè)置的嗎?在程序的一開始就設(shè)置了!好了,這里就把USVN_Config_Ini這個類讀取進來了。

    看到這里你就該明白了,如果你自己定義了一個類,并且注冊了Namespace,比如USVN,那么你就應(yīng)該在include_path下面創(chuàng)建一個同名文件夾(大小寫必須區(qū)分),然后你要引入的相對的文件路徑名就是以類名的_做分隔讀入的。

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

    PHP編程

    鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

  • 發(fā)表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發(fā)表
    主站蜘蛛池模板: 德清县| 牡丹江市| 淮北市| 蛟河市| 江达县| 遂宁市| 静宁县| 隆子县| 时尚| 微山县| 宣威市| 绥滨县| 苍山县| 壤塘县| 武安市| 时尚| 荔波县| 神池县| 旅游| 五莲县| 涞水县| 禹州市| 和林格尔县| 和静县| 福建省| 建瓯市| 诸城市| 康乐县| 望奎县| 华蓥市| 凉山| 武乡县| 沙河市| 冕宁县| 凤台县| 子长县| 武城县| 阆中市| 河池市| 四川省| 延吉市|