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

溫馨提示×

溫馨提示×

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

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

Thinkphp源碼分析之類的自動加載

發布時間:2020-07-20 05:54:31 來源:網絡 閱讀:710 作者:小海哥2010 欄目:web開發

在核心類文件Think.class.php里,Think定義了autoload方法,并用spl_autoload_register注冊為自動加載的方法。下面來解說下該方法的原理。

ThinkPHP的自動加載分三種情況:

1.map映射

Think類里定義了$_map屬性,用來保存用戶添加的類映射信息

方法addMap和getMap分別用于添加和獲取映射信息。如果$_map里存在$class的映射,則直接引入class,

// 檢查是否存在映射
if(isset(self::$_map[$class])) {
include self::$_map[$class];
}

2.命名空間下的自動加載

首先判斷$class是否含有\\,用以區分命名空間自動加載和非命名空間加載。其結果無非獲取一:類的basename,二:類的dirname。然后拼接類的路徑

這里有系統的命名空間和用戶自定義的命名空間,系統命名空間會自動定位,dirname為LIB_PATH

$name = strstr($class, '\\', true);
if(in_array($name,array('Think','Org','Behavior','Com','Vendor')) || is_dir(LIB_PATH.$name)){ 
// Library目錄下面的命名空間自動定位
$path = LIB_PATH;
}


自定義命名空間以模塊為命名空間,dirname為模塊所在的上級目錄

// 檢測自定義命名空間 否則就以模塊為命名空間
$namespace = C('AUTOLOAD_NAMESPACE');
$path = isset($namespace[$name])? dirname($namespace[$name]).'/' : APP_PATH;

最后拼接類的路徑,引入類文件

$filename = $path . str_replace('\\', '/', $class) . EXT;
if(is_file($filename)) {
// Win環境下面嚴格區分大小寫
if (IS_WIN && false === strpos(str_replace('/', '\\', realpath($filename)), $class . EXT)){
return ;
}
include $filename;


3.不是用命名空間下的加載

這里分為自動加載的類庫層,TP默認為Controller和Model下的類,這兩個目錄下的類文件會被自動加載

還有一個自定義的自動加載的路徑,通過import方法載入,import方法包含三個參數:

@param string $class 類庫命名空間字符串@param string $baseUrl 起始路徑 @param string $ext 導入的文件擴展名
function import($class, $baseUrl = '', $ext=EXT) {}

這個方法里包含了加載當前模塊,公共模塊,第三方模塊和其他模塊下的類的引入。并進行了緩存





向AI問一下細節

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

AI

淮安市| 天气| 新和县| 鲜城| 连州市| 湖州市| 绵竹市| 专栏| 嘉鱼县| 佳木斯市| 象山县| 长武县| 忻城县| 安义县| 广河县| 小金县| 繁昌县| 吴川市| 太保市| 扎赉特旗| 佛山市| 义乌市| 石泉县| 汉中市| 东城区| 永安市| 莱芜市| 信阳市| 大关县| 南漳县| 曲阳县| 香河县| 峨山| 古浪县| 罗城| 波密县| 葵青区| 佛冈县| 河曲县| 罗江县| 崇阳县|