ThinkPHP5源码阅读-类的自动加载register与autoload的实现

简介: PHP快速入门与实战ThinkPHP是国内最流行的一款PHP框架,是国人自主研发的框架,起源于2006年,经过了十几年的不断发展。已经成为了一款被PHP广泛认可的性能开发效率兼具的利器。阅读框架源码有助于我们更好的学习语言基础,拓展设计模式等相关能力。同时很多设计与编码的思想也能更好的指导我们日常工作,尤其是想成为资深程序员或者架构师方面的同事,这是一个必须要学习的过程。今天是ThinkPHP5源码第一讲,关于类的自动加载,看看源码底层是怎么实现的。怕迷路的同学,先给个关注吧。

前言

本文已收录于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快速入门与实战中,感谢大家支持。喜欢记得三联哟。

相关文章
|
前端开发 JavaScript 安全
前端框架Layui实现动态选项卡&iframe使用(附源码)
前端框架Layui实现动态选项卡&iframe使用(附源码)
2365 0
|
存储 缓存 Java
SpringBoot整合EhCache
SpringBoot默认情况下是整合了EhCache的,但是默认整合的EhCache的2.x版本,本文依然整合EhCache的3.x版本。
253 0
|
运维 NoSQL 前端开发
介绍一下Redis的优缺点
【10月更文挑战第19天】介绍一下Redis的优缺点
|
Go
Golang注释与godoc详解
这篇文章详细介绍了Go语言中注释的格式、位置以及如何使用godoc工具生成和查看项目代码的注释文档。
444 4
Golang注释与godoc详解
|
Java 数据安全/隐私保护
Fortify——安装并修改报告语言为中文
Fortify——安装并修改报告语言为中文
1207 0
Fortify——安装并修改报告语言为中文
|
XML JSON 数据挖掘
天猫商品评论接口:从申请到应用全攻略
天猫商品评论数据接口(Tmall.item_review)让商家与开发者获取天猫商品评论数据。接口通过HTTP请求提供评论内容、时间、评分等信息,助力商家优化产品与营销策略。使用需创建应用获App Key/Secret,编写代码调用并处理JSON/XML响应。适用于数据分析、商品优化、营销推广及客户管理。遵循规定合法使用数据。
|
开发框架 缓存 Java
JSP 教程 之 Eclipse JSP/Servlet 环境搭建 1
本教程指导如何使用Eclipse搭建JSP/Servlet开发环境。需下载Eclipse J2EE和Tomcat,将Tomcat解压至无中文和空格的D盘目录。启动Tomcat后,服务器运行,通过浏览器访问`http://localhost:8080/`。在Tomcat的webapps\ROOT目录创建test.jsp文件,输入代码并访问`http://localhost:8080/test.jsp`以验证环境配置成功。
327 1
|
域名解析 网络协议 定位技术
DNS自动择优:提升网络体验的新途径
DNS自动择优是智能选择最佳DNS解析路径的技术,基于网络状况、服务器负载等因素优化响应速度和稳定性。虽不增加带宽,但能减少延迟,提高访问速度,尤其在处理远距或高负载服务器时效果明显。通过选择支持该服务的DNS提供商并调整设备设置即可启用。在复杂网络环境中,DNS自动择优可提升用户体验。
|
Java Spring Web App开发
JAVA SSH 框架介绍
SSH 为 struts+spring+hibernate 的一个集成框架,是目前较流行的一种JAVA Web应用程序开源框架。 Struts Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。
2131 0
|
存储 边缘计算 前端开发
边缘计算与云边协同
边缘计算是指在靠近物或数据源头的一侧,融合网络、计算、存储、应用核心能力的分布式开放平台,就近提供边缘计算服务,满足应用的实时性和数据保护等方面的需求。
685 56