thinkphp5 1框架解析(二) 自動載入

2021-08-26 17:55:02 字數 2876 閱讀 2974

第一篇中,我們提到了入口指令碼,也說了,裡面註冊了自動載入的功能

php 的自動載入是loader類中實現的,這個類在base.php中被引入

//base .php

// 載入loader類

require

__dir__

.'/library/think/loader.php'

;// 註冊自動載入

loader:

:register()

;

我們程式在這裡執行了 loader 中靜態方法 ,同時這也是乙個全部的類register()我們進入loader.php,按照上面執行順序看看其核心是什麼?

此方法行數過長,我們一點一點來分析

// 註冊系統自動載入

spl_autoload_register

($autoload?:

'think\\loader::autoload'

,true

,true

);

這就是註冊我們的自動載入函式,$autoload這個變數是傳的引數,然而我查詢 tp5.1 原始碼,也沒有發現有任何傳參的動作。我認為是多餘的引數,直接寫'think\\loader::autoload'就可以了。

如果不了解這個函式的同學,請看文章最頂部的那個連線,上面有詳細講解。

$rootpath

= self:

:getrootpath()

; self:

:$composerpath

=$rootpath

.'vendor'

.directory_separator

.'composer'

.directory_separator

;// composer自動載入支援if(

is_dir

(self:

:$composerpath))

=$composerclass::

$;}}

}else

}

為了支援 composer 拓展,在自動註冊時候,把composer 也順帶一起註冊了,把composer目錄對映關係存放到prefixdirspsr4這個靜態變數中,方便對拓展的呼叫。

// 註冊命名空間定義

self:

:addnamespace([

'think'

=>

__dir__

,'traits'

=>

dirname

(__dir__).

directory_separator

.'traits',]

);// 載入類庫對映檔案if(

is_file

($rootpath

.'runtime'

.directory_separator

.'classmap.php'))

// 自動載入extend目錄

self:

:addautoloaddir

($rootpath

.'extend'

);

這後面的**都大同小異,都是把 所需要用到的類,對映到prefixdirspsr4這個靜態變數中。到時候方便我們使用命名空間進行呼叫。

register()函式這裡就大概分析結束了。 接下來我們講一講autoload()

上面我們講spl_autoload_register的時候,說他註冊了autoload()函式,使我們在找不到類的情況下,來呼叫此函式。

//函式整體內容

public

static

function

autoload

($class)if

($file

= self:

:findfile

($class))

__include_file

($file);

return

true;}

}

我們擷取片段一點一點分析。

if

(isset

(self:

:$classalias

[$class])

)

這一段是判斷我們是否是使用了 tp5.1的靜態呼叫介面(facade),具體解釋可以參照官方文件的解釋,這個是在base.php的末尾註冊的

if

($file

= self:

:findfile

($class))

__include_file

($file);

return

true

;}

findfile($class)主要功能是根據類的名稱,配合我們之前儲存對映關係的靜態陣列prefixdirspsr4來找尋檔案的目錄。

如果找到就消除 linux 和 window 對路徑名稱的差異。(linux 嚴格區分大小寫,而win 沒有嚴格區分)

這裡主要是擔心在window環境下,路徑名稱大小寫沒分,所以我們根據linux的目錄規則重寫了檔案路徑

之後再加我們的目錄檔案

如果沒有找到,就報錯並寫入日誌

thinkphp5 1 框架鉤子和行為用法例項分析

thinkphp中的行為是乙個比較抽象的概念,可以把行為想象成在應用執行過程中的乙個動程式設計客棧作。在框架的執行流程中,例如路由檢測是乙個行為,靜態快取是乙個行為,使用者許可權檢測也是行為,大到業務邏輯,小到瀏覽器檢測 多語言檢測等等都可以當做是乙個行為,www.cppcns.com甚至說你希望給...

ThinkPHP5 1鉤子和行為

tp5.1的行為是乙個比較抽象的概念,執行的流程使用者的註冊,登入,退出登入等等都可以作為乙個行為。而不同的行為之間也具有位置共同性,比如,有些行為的作用位置在使用者註冊後,在登入之後,退出登入之後,等等有些行為的作用位置都是在應用執行前,有些行為都是在模板輸出之後,把這些行為發生作用的位置稱之為鉤...

thinkphp5 1 匯入excel檔案

public function importexcel 限制上傳 型別 ext substr strrchr files file name 1 if ext xls ext xlsx 讀取 filename files file tmp name reader iofactory createre...