当前位置:主页 > 技术方案 >

$chsMap的register方法

发布时间:2021-06-09 14:43   浏览次数:次   作者:admin
考虑了好久终于开始写这个系列了,期待着能写出一个既能提升又能面试搞定的系列。看完这篇文章后,如果你发现了面试中没有写到的热点问题或技术难点,期待评论区的指点,一起完善。
序言
现在再整理一下PHP的进阶路标,如有好的建议咔咔会第一时间收录。
自动装入loader的源代码分析。
1-1学习目的。
自动装入类。
两种方法会自动装载类。
必须使用spl_autoload_register。
自动装入实现定制文件的类。
加载1-2Composer。
在base.php中首先装载loader类,然后调用register方法,如上图咔咔所示。
来看看thinkphplibraryhinkLoader.php,里面有一种register方法,我们首先学习第一个知识点spl_autoload_register(),通过它来谈论spl_autoload_register的前世今生和简单用法,直接点击查看。
接下来是一个项目的root路径和一个titleser路径。
现在,我们已经开始加载sideser文件,这个过程非常简单。
一、判断siteser是否为目录。
判断autoload_static.php在路径下是否是文件。技术解决方案。
3.介绍了autoload_static.php文件。
4.返回已声明的所有类数组。
5.获取最后一个类ComserStaticInit30742487e00917c888d89ba216f165b9。
6.判断数组中是否存在数据,该数组为Com=serStaticInit30742487e00917c888d89ba216f165b9。
接下来,您将看到这两个属性都出现在vendorserautoload_static.php文件中。
下面是一些代码,它们估计了self::${$ata}=$${$ata};,这里的$ata是'prefly'LengthsPsr4','prefly','fly','clysMap','files','preflysPsr4','prefly','flysMap','files','files','prefly','prefly'。
这样,就可以直接在类中获得Com=serStaticInit30742487e00917c888d89ba216f165b9的对应属性值,即上图中的两个属性值。
1-3登记名称空间。
register方法文件或thinkphplibraryhinkLoader.php文件。
两个命令空间在这里注册,分别是think和traits。这就是addNamespace的方法了。
addNamespace方法中增加了Psr4空间。
然后进入addPsr4,ComposerStaticInit1e269472f484e157e90227b420ffca7a类的$prefixLengthsPsr4和$prefixDirsPsr4这两个属性都被这两个命名空间注册。
要对以上进行断点调试,您应该清楚地看到这些数据,而且traits也是以同样的方式注册的。
最后,命名空间注册完毕,下面来看看psr4命名空间是什么东西吧。
一到四psr4是什么玩意?
psr是psr4规范,可以简单地理解为文件路径、自动装载对应类的相关规范、当前的TP5.1使用。
类在这里指class,接口,超类结构。
整个类都需要<命名空间>(<子命名空间)*<类名称>的结构。
下列规格来自PHP文档。
整个类名称必须具有一个顶级名称空间,即"vendornamespace";
整个类名称可以具有一个或多个子名称空间;
完全类名称必须具有最终类名称;
在整个类名中,任意一部分的下滑线不具有任何特殊意义;
完全类名称可以包含任何大小写字母;
一切类别名称都必须是大小写敏感的。
这里有一个正式的例子,这个psr规范能够理解,也能够理解。
1-5装入类库映射文件。
在这里,肯定会有人问,在这里为什么不能找到cysmap.php文件。
最后就是addClassMap这个方法了,它只是简单地将文件cysmap.php的数据赋给$cysMap,没有其他用途。
1-6自动载入扩展目录。
extend这个目录包含了TP框架所使用的所有东西,并且可以在这个目录的里边存储定制的类库文件。
下面的图表显示了使用addAutoLoadDir加载该方法。
还可以简单地将extend的路径分配给$fallbackDirsPsr4这个属性。
这里是Loader::register();这一部分就结束了,接下来我们将深入讨论内部实现和实践案例。
上述阅读源代码有四种属性,简单整理一下。
二、简单的装入程序。
当您开始解析这个源代码时,会出现一个函数spl_autoload_register。
如果没有引入所需的类,则在PHP报错之前触发该函数,而未定义的类名会作为参数传入此处,直接执行thinkLoader::autoload此方法。
通过断点第一个未装载的类就是thinkError。
thinkError为何如此!返回到thinkphp/base.php即可看到,当完成自动加载执行之后,首先执行的类是Error。
只需做一个简单的测试,把这个Error转换成Kaka,然后打印出来,这个类就变成了Kaka。现在大家已经对这个类的自动装入机制有所了解。
在未引入所用的类时,将该类作为参数传递给thinkphp/library/think/Loader.php的自动方法。
现在我们来看看autoload的这一方法。
首先从findFT方法开始,并将不确定的类传入到该方法中,在findFT方法中,直接将thinkError这个类映射的文件返回到caMap属性中。
在把类thinkError的完整路径返回给autoload的flash变量之后,将win环境的大小写改为complete。
之后,直接使用inclu引入文件,直到返回为止。
在此之前,这一直是一个完整类的自动装入解析。
尽管到此为止,仍需进一步讨论一下$chsMap的属性,该属性基于文件chp.map.php,该文件的生成也需要执行命令phpthinkoptimize:autoload生成。
程序是如何在没有生成此文件的情况下执行的?
以前的所有过程都是一样的,只是在findFlyer这里不同,下面简单梳理一下。
这段代码肯定不会使用classMap。
首先获得一个thinkError文件。
之后,Composer自动装载中的两个属性以获得命名空间,拼接thinkError.php文件。
结果还包括D:phpstudy_proWWWThinkPHPSourceCodeAnalysishinkphplibraryhinkError.php此文件。
这段代码需要仔细阅读。
在这里,类的自动加载已经完全结束。
定制文件是如何实现类的自动装入的。
首先建立资料夹kaka。
就在那时