TP的自动加载
2019-07-16 本文已影响2人
imjcw
这里是用
thinkphp 3.2.0
版本的框架来做分析的
原本不想解析这一部分的,原因是比较简单。不过,既然看了,就直接看一下。
这里主要用到了 PHP
的一个内置函数 spl_register_autoload
。
想要了解这个函数,建议参照官方的文档 autoload。
之前也写过怎么写一个自动加载类,有兴趣的可以看看 自动加载模块。
目前写的比较好的是 composer
的自动加载,里面有一些优化的算法,有兴趣的可以研究研究。
回归正题。
TP
的自动加载就四个规则:映射
、框架
、自定义
、应用
。
添加映射
<?php
static public function addMap($class, $map=''){
if(is_array($class)){
self::$_map = array_merge(self::$_map, $class);
}else{
self::$_map[$class] = $map;
}
}
在 映射
的规则上,我们只需要在配置文件中添加相应的映射即可,比如:alias.php
。
这里的 alias.php
会可以是框架级别的,可以是应用级别的,也可以是模块级别的。
自动加载
第一步:判断是否存在于映射,如果存在,则直接返回文件。
这里存在一个问题,如果添加映射的时候,出错了,没有判断文件是否存在,会造成错误。
<?php
if(isset(self::$_map[$class])) {
include self::$_map[$class];
}
第二步:判断是否框架文件。
<?php
if(in_array($name,array('Think','Org','Behavior','Com','Vendor')) || is_dir(LIB_PATH.$name)){
// Library目录下面的命名空间自动定位
$path = LIB_PATH;
}
第三步:如果不是框架文件,则获取自定义命名空间,如果没有自定义,则获取模块的命名空间。
<?php
$namespace = C('AUTOLOAD_NAMESPACE');
$path = isset($namespace[$name])? dirname($namespace[$name]).'/' : APP_PATH;
最终会拼凑文件路径,判断文件是否存在,然后加载文件。
本文没有说大小写的问题,建议开发时强制严格区分大小写,毕竟约定大于兼容。
最后
其实 TP
的自动加载很简单,没有太多的算法。
感兴趣的同学可以深入研究一下 composer
的自动加载。