ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# thinkphp的自动加载 # 1. 首先载入loader.php文件 然后使用loader::register()进行自动加载 方法名中包含以下 ![](https://img.kancloud.cn/eb/e2/ebe21ebd3a62bc3109a6fbba1fdc94b4_607x240.png) ## 2. register()方法中 ## 第一步使用sql\_autoload\_register()自动加载类 然后获取到composer路径并导入componser文件下的的auto\_static.php文件 auto\_static.php文件中 定义了两个静态属性:prefixLengthPsr4和prefixDirsPsr4 ### prefixLengthPsr4 = array('t' => array('think\\componser' => 15),'a' => array('app'=>4)) ### prefixDirsPsr4 = array('think\\componser' =>array(0 => '/top/think/think-installer/src'),'app' =>array(0=>'/application')) ![](https://img.kancloud.cn/97/e0/97e03c3b061f530dae4f926527bd2b7d_708x537.png) 接下来 获取到所有的类名数组 然后从使用array\_pop()数组中弹出最后一个数组 ``` <pre class="calibre13">``` <span class="token4">"Composer\\Autoload\\ComposerStaticInit25f893be97b63d60134b87b9c2e8987a"</span> ``` ``` ![](https://img.kancloud.cn/69/a0/69a0afadd3bc756435b4fd092ddecb30_664x102.png) 使用property\_exists() 检查遍历的字符串是否在 上面的弹出的类数组中 ![](https://img.kancloud.cn/b6/f0/b6f0eec3caf161ed1beff35519bbfed5_923x201.png) ![](https://img.kancloud.cn/af/a5/afa559ee63785e1fe9355ce5a0cf2c2e_647x117.png) ![](https://img.kancloud.cn/68/81/6881b9ebb253f6e85243fedf930e3adb_1586x384.png) ## 3. 注册命名空间: ### 调用addNamespace() 参数是一个数组 参数是: array(2) { \["think"\] =>string(57) "C:\\Users\\Administrator\\Desktop\\tp5\\thinkphp\\library\\think" \["traits"\] =>string(58) "C:\\Users\\Administrator\\Desktop\\tp5\\thinkphp\\library\\traits"} ![](https://img.kancloud.cn/7b/bc/7bbcfc3d81368a8c1f7257ef2171a84c_793x164.png) 在addNamespace中 又调用了addPsr4()参数是(上面的数组)并执行遍历由原来的二维数组 遍历成结果是一维数组 ![](https://img.kancloud.cn/81/70/81704329c678a2866f09db752c3c1e69_971x342.png) addPsr4的方法作用是添加Psr4空间 因为传过来的参数不为空 所以走流程如下图所示: ![](https://img.kancloud.cn/32/6f/326f5b503fee0fe7ec44bf1bdc832b1f_983x723.png) 因为没有找到这个值 所以走这个逻辑: ![](https://img.kancloud.cn/5d/c0/5dc01953d590b7d8ad7af4e0aeec9189_815x299.png) 最后就添加到了Psr4空间中 ![](https://img.kancloud.cn/9c/b4/9cb43d23b833fa16ab99643cc45ca471_770x95.png) ![](https://img.kancloud.cn/04/b1/04b12da9e23d1541fcbfd321686ce77b_763x476.png) ## 4. 加载类库映射文件 ### 调用addClassMap() 因为已经使用命令创建了类库映射文件 所以走箭头逻辑 ![](https://img.kancloud.cn/59/cc/59cc8ebcb7f7f1ad781581d7d48ca7ca_492x61.png) ![](https://img.kancloud.cn/de/98/de983fb43e9b1f11a430d6810cc93e4e_963x272.png) addClassMap()参数是刚生成的classMap.php文件内容 把类库文件内容 赋值给**self::$classMap** ### 5. 自动加载extend目录 ![](https://img.kancloud.cn/19/fc/19fcb54816627745b44eada422b93765_638x105.png) 调用addAutoLoadDir()参数是extend的路径 在addAutoLoadDir中 把路径赋值给 **self::$fallbackDirsPsr4** ![](https://img.kancloud.cn/e5/06/e506967c42e6f36f13256870c7c57554_543x151.png) # -----------分割线----------- ## 注册错误和异常处理机制 ![](https://img.kancloud.cn/1b/5d/1b5dfdd3bc56aebfdeb9aac42838e20c_643x235.png) ### 1。Error类没有引用直接使用了 因此就出发了自动加载机制 就会自动调用Loader.php文件中的spl\_autoload\_register() ![](https://img.kancloud.cn/4c/9d/4c9d9953c29335715c224d0ea139b0bc_801x108.png) 就会调用autoload方法 ![](https://img.kancloud.cn/81/6f/816f09bf036b923a6e81d24817e6af98_811x515.png) 在autoload中 先查看是否有别名 没别名就调用findFile()去类库文件查找 因为Error在类库文件中找到了 如果找不到就去Psr-4中寻找 然后去查找 PSR-4 fallback dirs 然后查找 PSR-0 然后查找 PSR-0 fallback dirs一路查找 如果还没找到 return **self::$classMap\[$class\]** = false; ![](https://img.kancloud.cn/08/f3/08f3e7d5e220b8c673e5755ae8b87f85_779x520.png)