前言
本文已收錄于PHP全棧系列專欄:PHP快速入門與實戰(zhàn)
ThinkPHP是國內最流行的一款PHP框架,是國人自主研發(fā)的框架,起源于2006年,經過了十幾年的不斷發(fā)展。已經成為了一款被PHP廣泛認可的性能開發(fā)效率兼具的利器。
閱讀框架源碼有助于我們更好的學習語言基礎,拓展設計模式等相關能力。同時很多設計與編碼的思想也能更好的指導我們日常工作,尤其是想成為資深程序員或者架構師方面的同事,
這是一個必須要學習的過程。今天是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
文件夾下面,如下圖。
類的準備
現(xiàn)在我們通過xdebug,一步一步來跟蹤tp5是如何實現(xiàn)類的自動加載的。
進入base.php
首先走到 thinkphp/base.php 這一行,進入。
Loader::register() 注冊自動加載函數(shù)
現(xiàn)在進入到base.php文件??梢钥吹竭@里便引入了Loader.php,引入之后調用Loader靜態(tài)方法register()進行類的自動加載注冊。
接下來進入register()看看到底干了什么事情。通過下圖可以看到,先通過php底層方法spl_autoload_register聲明,這個函數(shù)的作用是如果找不到類,嘗試走哪一個方法進行類加載。這個方法之前有一篇文章我講到過,有需要可以到我博客翻一翻。
對composer 的支持
上面86行處提到了composer自動加載支持,這里是重點,告訴了我們tp5是如何找到composer里面的類。大家可以翻閱自己項目下面的vendor/composer/autoload_static.php這個文件,這個文件里面在執(zhí)行composer install或者update之后會同步更新,它告訴了框架,當前composer管理了哪些php包,并且應該按照何種方式加入到框架??梢砸娤聢D。
對think和trait的支持
接下來通過addNamespace把think和trait這兩個tp5本身自帶的類庫增加自動化加載配置。
對extend目錄的支持
然后再register()方法最后,將extend目錄也自動放入加載路徑。這就是為什么在根目錄下面的extend里面的類能夠被自動識別和加載的原因。
前面所有的操作就是把所有的類找到并且做好映射并存儲到prefixLengthsPsr4
,prefixesPsr0
這些靜態(tài)變量上面去,后面就來講解怎么使用他們。
類的加載
autoload方法
上面部分內容我們已經知道think\\Loader::autoload
這個方法來進行處理類加載,其實就是Loader.php本類的一個方法。然后我們跟蹤進去autoload()方法。見下圖。
class_alias的定義和使用
class_alias是類的別名,別名注冊同樣來自于base.php。使用別名可以非常方便的簡化我們的使用,可以看到,tp5的很多自定義方法都是通過別名進行注冊的??吹竭@里,是不是覺得有些理解Config這些是怎么實現(xiàn)的呢。別著急,后面其他章節(jié)會講到。今天不作為重點。
findFile 查找類
下面繼續(xù)閱讀Loader里面findFile這個方法。其實現(xiàn)邏輯就是通過前面已經維護好的類映射關系去不斷尋找命中命名空間的類。直到找到位置。
作業(yè):自定義一個可以被自動類加載的目錄。
閱讀了上面的源碼,不難發(fā)現(xiàn),比如要根目錄下面的tool目錄能夠被自動類加載,只需要在extend目錄的支持的地方將tool目錄放進去就可以了。文章來源:http://www.zghlxwxcb.cn/news/detail-480269.html
總結
以上就是關于本篇文章介紹的內容,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模板網!