🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### :-: **自动加载基本原理** include 和 require 是PHP中引入文件的两个基本方法。在小规模开发中直接使用 include 和 require 没什么问题,但在大型项目中会造成大量的 include 和 require 堆积。这样的代码既不优雅,执行效率也很低,而且维护起来也相当困难。 **为了解决这个问题,部分框架会给出一个引入文件的配置清单,在对象初始化的时候把需要的文件引入。但这只是让代码变得更简洁了一些,引入的效果仍然是差强人意。PHP5 之后,随着 PHP 面向对象支持的完善,__autoload 函数才真正使得自动加载成为可能。** >[success] > **include 和 require 功能是一样的,它们的不同在于 include 出错时只会产生警告,而 require 会抛出错误终止脚本。** >[success] > **include_once 和 include 唯一的区别在于 include_once 会检查文件是否已经引入,如果是则不会重复引入。** 实现自动加载最简单的方式就是使用 __autoload 魔术方法。当在逻辑中实例化一个类,或者调用一个类的静态方法时类没有被引入,这个函数会被触发,未定义的类名会被当作参数传入。至于函数具体的逻辑,这需要用户自己去实现。通常的做法是在这个函数里面通过类名构造出类文件所在的物理路径,然后调用include或者require函数引入,这样只要我们设置框架的时候类的命名规范和类的物理路径遵循一定关系规范即可达到自动引入类文件的目的。 ### **其他参考** https://www.cnblogs.com/CpNice/p/4119925.html https://www.jb51.net/article/142696.htm http://www.php.cn/php-weizijiaocheng-371939.html ### :-: **thinkphp5.0 自动加载原理解析** **这里我们以thinkphp5.0里的自动加载机制为例,深度解析其实现原理** >[danger] >**如果你没搭建断点调试环境,请先移步 “调试环境的搭建” 章节,搭建环境后跟随我的教程测试** ![](https://box.kancloud.cn/8cf7d3453d4524a0bf6330a5ec9a3ca5_801x318.png) base.php 里有这行代码就是实现注册加载的代码,进去看代码 ``` \think\Loader::register(); ``` ![](https://box.kancloud.cn/7309f154e9ad6111c76cf7e9687aeb1f_1268x784.png) 这部分代码的本质是将 composer 自动生成的类映射文件属性复制到 Loader 的属性里 后面大家在使用 composer 里的类时候,会在这个属性里查找 查看 autoload_static.php 里,这里面的类映射文件是在你使用 composer 下载类库的时候自动生成 ![](https://box.kancloud.cn/ba953fa38fd6dfc937b3b4b3fae60fff_918x744.png) 在在295行的循环走完以后,查看 Loader 类的属性会发现 autoload_static.php 里的属性已经被复制过来 ![](https://box.kancloud.cn/f7b4ae4cc7d9a61d00b2b8b10280f45a_1206x749.png) 306行是将 thinkphp 自定义的核心库添加到自动加载映射表中 这样我们就可以使用 think 类内置的核心库 比如 在我们调用这样一行代码时候 ,前面的 \think 这个命名空间就和 307 行的 那个键对应,系统会根据这个键取到后面的路径 即 `LIB_PATH . 'think' . DS`,真实路径为` E:\localweb\public_local2\thinkphp\library` 然后根据 `\think\Db` 构造出类的真实路径` E:\localweb\public_local2\thinkphp\library\think\Db.php ` 实现类的自动加载