thinkphp自动加载

版权声明:本文为博主原创文章,未经博主允许不得转载。喵~ https://blog.csdn.net/weixin_38052017/article/details/89317913

自动加载这个东西主要作用就是不用手动的require文件进来

比方说我要用LibClass,通常我们要先require LibClass.php然后才能使用LibClass是吧。但是php自动加载这个功能就能够很好的帮助我们,不用一个文件里面require N多的东西。

首先说下这个的实现原理

1、php在实例化一个类的时候先会找类的定义,找不到的话会去调用__autoload()这个魔术方法来做操作。所以我们可以在__autoload()里面写上我们的引入文件的操作。原理就是这么简单,没了没了,回家吃饭。。。。。。

但是这么做是会有弊端的:

①、__autoload()是一个函数,不能够反复的去定义,如果这个项目有几个人开发需要不同的文件引入规则就gg了。

②、还有就是使用第三方类库,鬼晓得他的结构是什么样的,怎么来实现自动加载。

③、这个函数7.2以后好像官方就不支持了,还这么写怕是要gg。

2、基于上述三点,现在主流的自动加载都做了改进啦。

①、不怎么使用__autoload()了,改成使用spl_autoload_register 

bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false]]] )

将函数注册到SPL __autoload函数队列中。如果该队列中的函数尚未激活,则激活它们。

如果在你的程序中已经实现了__autoload()函数,它必须显式注册到__autoload()队列中。因为spl_autoload_register()函数会将Zend Engine中的__autoload()函数取代为spl_autoload()spl_autoload_call()

如果需要多条 autoload 函数,spl_autoload_register() 满足了此类需求。 它实际上创建了 autoload 函数的队列,按定义时的顺序逐个执行。相比之下, __autoload() 只可以定义一次。

不好意思我比较懒直接拷贝官方的说明

②、然后我们来看下tp5的自动加载时怎么实现的,差不多就比较清楚这个自动加载了。

首先注册自动加载,使用的系统自定义Loader::autoload方法来实现的。

然后找到类文件,然后 引入

就是这么简单,当然其中有很多其他的逻辑判断,比如说根据命名空间还有composer支持还有psr4规则支持等。但是我们可以看到,核心的实现就是这么简单。有时间的话再来一一分析这几个加载。原理就这些了,溜了溜了。。。。 (20180505 深圳)

猜你喜欢

转载自blog.csdn.net/weixin_38052017/article/details/89317913
今日推荐