第一节、类的自动加载
- 访问请求从入口文件进入,进入base.php
- 首先进行类的注册加载,执行这一步骤是在
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函数下面的循环就是依次循环这几种方式,如果存在的话,就会赋值到对应的数组变量当中
- 再往下,注册命名空间定义,注册的是thinkphp/library目录下的两个文件加的命名空间,键名为命名空间,键值为命名空间所在路径
- 加载类库映射文件,在框架文件夹根目录下执行命令
php think optimize:autoload
可以生成一个classmap.php文件,这个文件是框架中所有类库的命名空间和所在路径的映射。这里会把classmap.php文件中所有类合并到self::$classMap数组中
- 下面的代码
// 自动加载extend目录
self::addAutoLoadDir($rootPath . 'extend');
可以自由加载我们定义的目录
这一段代码中涉及到的php函数:
strtr — 转换指定字符
class_alias — 为一个类创建别名
realpath-返回规范化的绝对路径名
dirname — 返回路径中的目录部分
get_declared_classes — 返回由已定义类的名字所组成的数组
array_pop — 弹出数组最后一个单元(出栈)
property_exists — 检查对象或类是否具有该属性