ThinkPHP

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 的自动加载。

上一篇下一篇

猜你喜欢

热点阅读