国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ThinkPHP5源碼閱讀-類的自動加載register與autoload的實現(xiàn)

這篇具有很好參考價值的文章主要介紹了ThinkPHP5源碼閱讀-類的自動加載register與autoload的實現(xiàn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


前言

本文已收錄于PHP全棧系列專欄:PHP快速入門與實戰(zhàn)

ThinkPHP是國內最流行的一款PHP框架,是國人自主研發(fā)的框架,起源于2006年,經過了十幾年的不斷發(fā)展。已經成為了一款被PHP廣泛認可的性能開發(fā)效率兼具的利器。
ThinkPHP5源碼閱讀-類的自動加載register與autoload的實現(xiàn)

閱讀框架源碼有助于我們更好的學習語言基礎,拓展設計模式等相關能力。同時很多設計與編碼的思想也能更好的指導我們日常工作,尤其是想成為資深程序員或者架構師方面的同事,
這是一個必須要學習的過程。今天是ThinkPHP5源碼第一講,關于類的自動加載,看看源碼底層是怎么實現(xiàn)的。怕迷路的同學,先給個關注吧。

如何下載ThinkPHP5源碼

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
composer config -g repo.packagist composer https://packagist.phpcomposer.com
composer create-project topthink/think=5.1.* tp5  --prefer-dist

本節(jié)所用到的版本是ThinkPHP5.1.41 LTS,如何查看ThinkPHP5的版本,在目錄下面的文件
thinkphp/library/think/App.php:23行可以查看。

為了更好的調試與追蹤代碼,建議使用xdebug進行代碼分析,能夠達到事半功倍的效果。如何安裝xdebug請查閱我歷史的文章,有詳細講解到。ThinkPHP5后續(xù)也成TP5。

關于自動加載類

類的加載是任何框架都必須實現(xiàn)的,并且是框架運作的第一步,因為項目運營本身是依賴于代碼文件的運行,如何正確,高效并且健康正確的加載項目或者類文件,是框架實現(xiàn)至關重要的一步。
TP5主要是基于FPM運作的傳統(tǒng)單入口框架,所以在請求的時候首先會走到入口index.php文件,其在./public文件夾下面,如下圖。
ThinkPHP5源碼閱讀-類的自動加載register與autoload的實現(xiàn)

類的準備

現(xiàn)在我們通過xdebug,一步一步來跟蹤tp5是如何實現(xiàn)類的自動加載的。

進入base.php

首先走到 thinkphp/base.php 這一行,進入。
ThinkPHP5源碼閱讀-類的自動加載register與autoload的實現(xiàn)

Loader::register() 注冊自動加載函數(shù)

現(xiàn)在進入到base.php文件??梢钥吹竭@里便引入了Loader.php,引入之后調用Loader靜態(tài)方法register()進行類的自動加載注冊。
ThinkPHP5源碼閱讀-類的自動加載register與autoload的實現(xiàn)
接下來進入register()看看到底干了什么事情。通過下圖可以看到,先通過php底層方法spl_autoload_register聲明,這個函數(shù)的作用是如果找不到類,嘗試走哪一個方法進行類加載。這個方法之前有一篇文章我講到過,有需要可以到我博客翻一翻。
ThinkPHP5源碼閱讀-類的自動加載register與autoload的實現(xiàn)

對composer 的支持

上面86行處提到了composer自動加載支持,這里是重點,告訴了我們tp5是如何找到composer里面的類。大家可以翻閱自己項目下面的vendor/composer/autoload_static.php這個文件,這個文件里面在執(zhí)行composer install或者update之后會同步更新,它告訴了框架,當前composer管理了哪些php包,并且應該按照何種方式加入到框架??梢砸娤聢D。
ThinkPHP5源碼閱讀-類的自動加載register與autoload的實現(xiàn)

對think和trait的支持

接下來通過addNamespace把think和trait這兩個tp5本身自帶的類庫增加自動化加載配置。
ThinkPHP5源碼閱讀-類的自動加載register與autoload的實現(xiàn)

對extend目錄的支持

然后再register()方法最后,將extend目錄也自動放入加載路徑。這就是為什么在根目錄下面的extend里面的類能夠被自動識別和加載的原因。
ThinkPHP5源碼閱讀-類的自動加載register與autoload的實現(xiàn)

前面所有的操作就是把所有的類找到并且做好映射并存儲到prefixLengthsPsr4,prefixesPsr0這些靜態(tài)變量上面去,后面就來講解怎么使用他們。

類的加載

autoload方法

上面部分內容我們已經知道think\\Loader::autoload這個方法來進行處理類加載,其實就是Loader.php本類的一個方法。然后我們跟蹤進去autoload()方法。見下圖。
ThinkPHP5源碼閱讀-類的自動加載register與autoload的實現(xiàn)

class_alias的定義和使用

class_alias是類的別名,別名注冊同樣來自于base.php。使用別名可以非常方便的簡化我們的使用,可以看到,tp5的很多自定義方法都是通過別名進行注冊的??吹竭@里,是不是覺得有些理解Config這些是怎么實現(xiàn)的呢。別著急,后面其他章節(jié)會講到。今天不作為重點。
ThinkPHP5源碼閱讀-類的自動加載register與autoload的實現(xiàn)

findFile 查找類

下面繼續(xù)閱讀Loader里面findFile這個方法。其實現(xiàn)邏輯就是通過前面已經維護好的類映射關系去不斷尋找命中命名空間的類。直到找到位置。
ThinkPHP5源碼閱讀-類的自動加載register與autoload的實現(xiàn)

作業(yè):自定義一個可以被自動類加載的目錄。

閱讀了上面的源碼,不難發(fā)現(xiàn),比如要根目錄下面的tool目錄能夠被自動類加載,只需要在extend目錄的支持的地方將tool目錄放進去就可以了。

總結

以上就是關于本篇文章介紹的內容,ThinkPHP5源碼閱讀-類的自動加載register與autoload的實現(xiàn),后續(xù)更多內容將收錄在專欄PHP快速入門與實戰(zhàn)中,感謝大家支持。喜歡記得三聯(lián)喲。文章來源地址http://www.zghlxwxcb.cn/news/detail-480269.html

到了這里,關于ThinkPHP5源碼閱讀-類的自動加載register與autoload的實現(xiàn)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • thinkphp5攔截驗證token

    寫一個BaseController 類 基本思路: 1、繼承一個公共基類,將驗證相關代碼放在基類 2、根據(jù) 孩子類下的notNeedToken 來決定是否進行驗證 3、驗證失敗后,直接響應回來 這里需要封裝一個主要代碼: 如果直接return 返回,是不會終止執(zhí)行的,而是會繼續(xù)執(zhí)行到指定的控制器,所以

    2024年02月15日
    瀏覽(22)
  • thinkPhp5返回某些指定字段

    thinkPhp5返回某些指定字段

    或者指定要的字段的數(shù)組? 查詢符合條件的多條數(shù)據(jù) ?

    2024年02月09日
    瀏覽(27)
  • ThinkPHP5遠程命令執(zhí)行漏洞

    ThinkPHP5遠程命令執(zhí)行漏洞

    ThinkPHP是一個快速、兼容而且簡單的輕量級國產 PHP開發(fā)框架?,誕生于2006年初,原名FCS,2007年元旦正式更名為ThinkPHP,遵循Apache2開源協(xié)議發(fā)布,使用面向對象的開發(fā)結構和 MVC模式 ,從Struts結構移植過來并做了改進和完善,同時也借鑒了國外很多優(yōu)秀的框架和模式。 由于th

    2024年02月11日
    瀏覽(26)
  • Thinkphp5.x全漏洞復現(xiàn)分析

    Thinkphp5.x全漏洞復現(xiàn)分析

    我們可以把namespace理解為一個單獨的空間,事實上它也就是一個空間而已,子命名空間那就是空間里再劃分幾個小空間,舉個例子: 當有多個子命名空間有相同名稱類時,不指定使用哪個命名空間的情況下取最后定義的命名空間中的類,比如上面的 dog 取的時 dogC 中的類,在

    2024年04月22日
    瀏覽(25)
  • ThinkPHP5.0.23 遠程代碼執(zhí)行漏洞

    ThinkPHP5.0.23 遠程代碼執(zhí)行漏洞

    ThinkPHP 是一款運用極廣的 PHP 開發(fā)框架。其 5.0.23 以前的版本中,獲取 method 的方法中沒有正確處理方法名,導致攻擊者可以調用 Request 類任意方法并構造利用鏈,從而導致遠程代碼執(zhí)行漏洞。 百度漏洞 獲得exp 路徑: POST傳參 我用的是hackbar,用burpsuite也行。 burp操作方法 抓包

    2024年02月11日
    瀏覽(23)
  • ThinkPHP5.0.21遠程命令執(zhí)行漏洞

    ThinkPHP5.0.21遠程命令執(zhí)行漏洞

    漏洞出現(xiàn)的背景 : ThinkPHP是?款運?極?的PHP開發(fā)框架。 其5.0.23以前的版本中,獲取method的?法中沒有正確處理?法名, 導致攻擊者可以調?Request類任意?法并構造利?鏈,從?導致遠程代碼執(zhí)?漏洞。 由于ThinkPHP5框架對控制器名沒有進??夠的安全檢測,導致在沒有開

    2024年02月04日
    瀏覽(23)
  • ThinkPHP5系列遠程代碼執(zhí)行漏洞復現(xiàn)(詳細)

    ThinkPHP5系列遠程代碼執(zhí)行漏洞復現(xiàn)(詳細)

    ThinkPHP是一款運用極廣的PHP開發(fā)框架。其版本5中,由于框架對控制器名沒有進行足夠的檢測,會導致在沒有開啟強制路由的情況下可執(zhí)行任意方法,從而導致遠程命令執(zhí)行漏洞。 漏洞危害 啟動環(huán)境 切換到/thinkphp/5.0.23-rce# 目錄下 將version改為2,保存并退出 接著執(zhí)行 此時環(huán)境

    2024年02月12日
    瀏覽(29)
  • 知識筆記(九十)———ThinkPHP5中時間查詢的方法

    使用 where 方法 where 方法支持時間比較,例如: 第三個參數(shù)可以傳入任何有效的時間表達式,會自動識別你的時間字段類型,支持的時間類型包括 timestamps 、 datetime 、 date 和 int 。 使用 whereTime 方法 whereTime 方法提供了日期和時間字段的快捷查詢,示例如下: 還提供了更方便

    2024年01月21日
    瀏覽(19)
  • PHP客服系統(tǒng)聊天頁面-thinkphp加載頁面源碼解釋

    PHP客服系統(tǒng)聊天頁面-thinkphp加載頁面源碼解釋

    PHP workerman客服系統(tǒng)加載聊天頁面的代碼邏輯流程,可以進行參考。如果想要二開修改的,可以根據(jù)這個流程來修改。 thinkphp的router部分 查看控制器加載頁面邏輯 application/index/controller/Index.php public function chat 函數(shù)里php處理部分 頁面路徑為:application/index/view/index/cli_box.html

    2024年02月14日
    瀏覽(17)
  • thinkphp5.0.24反序列化漏洞分析

    thinkphp5.0.24反序列化漏洞分析

    thinkphp5框架: thinkphp5的入口文件在 publicindex.php ,訪問 反序列化起點 寫一個反序列化入口點 全局搜索 __destruct() 函數(shù) thinkphp_5.0.24thinkphplibrarythinkprocesspipesWindows.php 中的 __destruct() 函數(shù),調用了removeFiles() 跟進removeFiles(),第163行的file_exists可以觸發(fā) __toString 方法 全局搜索

    2023年04月08日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包