前言
本文已收录于PHP全栈系列专栏:PHP快速入门与实战
ThinkPHP是国内最流行的一款PHP框架,是国人自主研发的框架,起源于2006年,经过了十几年的不断发展。已经成为了一款被PHP广泛认可的性能开发效率兼具的利器。
阅读框架源码有助于我们更好的学习语言基础,拓展设计模式等相关能力。同时很多设计与编码的思想也能更好的指导我们日常工作,尤其是想成为资深程序员或者架构师方面的同事,
这是一个必须要学习的过程。今天是ThinkPHP5源码第一讲,关于类的自动加载,看看源码底层是怎么实现的。怕迷路的同学,先给个关注吧。
如何下载ThinkPHP5源码
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
composer config -g repo.packagist composer https://packagist.phpcomposer.com
composer create-project topthink/think=5.1.* tp5 --prefer-dist
本节所用到的版本是ThinkPHP5.1.41 LTS
,如何查看ThinkPHP5的版本,在目录下面的文件thinkphp/library/think/App.php:23
行可以查看。
为了更好的调试与追踪代码,建议使用xdebug
进行代码分析,能够达到事半功倍的效果。如何安装xdebug
请查阅我历史的文章,有详细讲解到。ThinkPHP5后续也成TP5。
关于自动加载类
类的加载是任何框架都必须实现的,并且是框架运作的第一步,因为项目运营本身是依赖于代码文件的运行,如何正确,高效并且健康正确的加载项目或者类文件,是框架实现至关重要的一步。
TP5主要是基于FPM运作的传统单入口框架,所以在请求的时候首先会走到入口index.php
文件,其在./public
文件夹下面,如下图。
类的准备
现在我们通过xdebug,一步一步来跟踪tp5是如何实现类的自动加载的。
进入base.php
首先走到 thinkphp/base.php 这一行,进入。
Loader::register() 注册自动加载函数
现在进入到base.php文件。可以看到这里便引入了Loader.php,引入之后调用Loader静态方法register()进行类的自动加载注册。
接下来进入register()看看到底干了什么事情。通过下图可以看到,先通过php底层方法spl_autoload_register声明,这个函数的作用是如果找不到类,尝试走哪一个方法进行类加载。这个方法之前有一篇文章我讲到过,有需要可以到我博客翻一翻。
对composer 的支持
上面86行处提到了composer自动加载支持,这里是重点,告诉了我们tp5是如何找到composer里面的类。大家可以翻阅自己项目下面的vendor/composer/autoload_static.php这个文件,这个文件里面在执行composer install或者update之后会同步更新,它告诉了框架,当前composer管理了哪些php包,并且应该按照何种方式加入到框架。可以见下图。
对think和trait的支持
接下来通过addNamespace把think和trait这两个tp5本身自带的类库增加自动化加载配置。
对extend目录的支持
然后再register()方法最后,将extend目录也自动放入加载路径。这就是为什么在根目录下面的extend里面的类能够被自动识别和加载的原因。
前面所有的操作就是把所有的类找到并且做好映射并存储到prefixLengthsPsr4
,prefixesPsr0
这些静态变量上面去,后面就来讲解怎么使用他们。
类的加载
autoload方法
上面部分内容我们已经知道think\\Loader::autoload
这个方法来进行处理类加载,其实就是Loader.php本类的一个方法。然后我们跟踪进去autoload()方法。见下图。
class_alias的定义和使用
class_alias是类的别名,别名注册同样来自于base.php。使用别名可以非常方便的简化我们的使用,可以看到,tp5的很多自定义方法都是通过别名进行注册的。看到这里,是不是觉得有些理解Config这些是怎么实现的呢。别着急,后面其他章节会讲到。今天不作为重点。
findFile 查找类
下面继续阅读Loader里面findFile这个方法。其实现逻辑就是通过前面已经维护好的类映射关系去不断寻找命中命名空间的类。直到找到位置。
作业:自定义一个可以被自动类加载的目录。
阅读了上面的源码,不难发现,比如要根目录下面的tool目录能够被自动类加载,只需要在extend目录的支持的地方将tool目录放进去就可以了。
总结
以上就是关于本篇文章介绍的内容,ThinkPHP5源码阅读-类的自动加载register与autoload的实现,后续更多内容将收录在专栏PHP快速入门与实战中,感谢大家支持。喜欢记得三联哟。