thinkphp5.1框架源码学习——自动加载

第一节、类的自动加载

  1. 访问请求从入口文件进入,进入base.php
  2. 首先进行类的注册加载,执行这一步骤是在
thinkphp/library/think/Loader.php

中的register方法
3. 在register方法中首先会看到spl_autoload_register函数,这个函数和__autoload魔术方法类似,将函数注册到spl__autoload函数队列中,使用这个函数后如果碰到没有注册的类就去调用think\\Loader::autoload方法
4. 再看autoload方法:
autoload方法的第一个判断

if (isset(self::$classAlias[$class])) {
       return class_alias(self::$classAlias[$class], $class);
 }

是判断框架中有没有为类设置别名,如果设置了别名则使用class_alias为该类创建别名。后面会使用self::findFile来查找类的文件,再使用__include_file方法引入文件
5. 回到register方法,接下来会设置rootPath和composerPath,如果框架是composer安装的话,会依次查找是否有composer文件夹和文件夹中的autoload_static.php文件,通过get_declared_classes函数获取所有以定义的类,再用array_pop将最后一个类出栈,这个类就是composer类。
6. composer中通常具有以下几种加载文件的方式(标准):

['prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files']

我们看到array_pop函数下面的循环就是依次循环这几种方式,如果存在的话,就会赋值到对应的数组变量当中

  1. 再往下,注册命名空间定义,注册的是thinkphp/library目录下的两个文件加的命名空间,键名为命名空间,键值为命名空间所在路径
  2. 加载类库映射文件,在框架文件夹根目录下执行命令
php think optimize:autoload

可以生成一个classmap.php文件,这个文件是框架中所有类库的命名空间和所在路径的映射。这里会把classmap.php文件中所有类合并到self::$classMap数组中

  1. 下面的代码
// 自动加载extend目录
self::addAutoLoadDir($rootPath . 'extend');

可以自由加载我们定义的目录

这一段代码中涉及到的php函数:
strtr — 转换指定字符
class_alias — 为一个类创建别名
realpath-返回规范化的绝对路径名
dirname — 返回路径中的目录部分
get_declared_classes — 返回由已定义类的名字所组成的数组
array_pop — 弹出数组最后一个单元(出栈)
property_exists — 检查对象或类是否具有该属性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值