91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Zend中AutoLoad機制的原理是什么

發布時間:2021-01-15 16:58:17 來源:億速云 閱讀:133 作者:Leah 欄目:開發技術

本篇文章為大家展示了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);



過程分析

首先是設置了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下面創建一個同名文件夾(大小寫必須區分),然后你要引入的相對的文件路徑名就是以類名的_做分隔讀入的。

上述內容就是Zend中AutoLoad機制的原理是什么,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

商南县| 肇州县| 潍坊市| 晋城| 淅川县| 阳春市| 泽普县| 安龙县| 大足县| 金湖县| 平昌县| 资溪县| 清涧县| 沂源县| 宁陕县| 蚌埠市| 甘德县| 铜山县| 嘉黎县| 陵水| 阿巴嘎旗| 谷城县| 岚皋县| 北京市| 太谷县| 富阳市| 扬州市| 泗洪县| 汝阳县| 黄石市| 商水县| 阜南县| 石柱| 开远市| 陆河县| 桂林市| 阳信县| 梅州市| 太谷县| 水富县| 夏邑县|