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

news2024/9/20 18:33:30

文章目录

  • 前言
  • 如何下载ThinkPHP5源码
  • 关于自动加载类
  • 类的准备
    • 进入base.php
    • Loader::register() 注册自动加载函数
    • 对composer 的支持
    • 对think和trait的支持
    • 对extend目录的支持
  • 类的加载
    • autoload方法
    • class_alias的定义和使用
    • findFile 查找类
  • 作业:自定义一个可以被自动类加载的目录。
  • 总结


前言

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/638873.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java设计模式—责任链模式(Chin of Responsibility)

目录 前言 一、责任链模式的简介 二、责任链模式的概念 三、责任链模式的作用 四、责任链模式的优、缺点 1.责任链模式的优点 2.责任链模式的缺点 五、责任链模式的应用场景 六、代码案例 UML类图 1.定义一个请求枚举类 2.定义一个请求类 3.定义一个抽象处理接口 4、…

TS中any与unknown详解,示例

文章目录 前言一、一个示例二、示例目的1、功能描述2、主要区别3、代码实现 总结 前言 本片文章主要是在写ts时遇到不知道类型,很容易就想到用any可以解决一切,但这样写并不好。所以今天就总结学习一下,比较好的处理任意类型的unknown。 一、…

2023年最新网络安全入门指南,保姆级教程!啃完这篇就够了

一、网络安全学习的误区 1.不要试图以编程为基础去学习网络安全 不要以编程为基础再开始学习网络安全,一般来说,学习编程不但学习周期长,且过渡到网络安全用到编程的用到的编程的关键点不多。一般人如果想要把编程学好再开始学习网络安全往…

大气污染扩散模型Calpuff教程

详情点击链接:大气污染扩散模型Calpuff教程一,Calpuff 1.Calpuff模型 2、Calpuff模型基础 3、Calpuff模型下载安装 1)Calpro系统安装 2)安装环境要求 3)需安装的辅助软件二,数据预处理 1.网格设置 …

Vue3-04-生命周期

Vue 的生命周期描述组件从创建到销毁的全过程。Vue3 和 Vue2 的生命周期钩子非常像,我们仍然可以在相同的场景下使用相同的钩子函数。 Vue3 在设计时对先前的版本进行了向下兼容,如果你的项目还在使用选项式 API 进行构建,那么不需要修改生命…

【stable diffusion】图片批量自动打标签、标签批量修改(BLIP、wd14)用于训练SD或者LORA模型

参考: B站教学视频【:AI绘画】新手向!Lora训练!训练集准备、tag心得、批量编辑、正则化准备】官方教程:https://github.com/darkstorm2150/sd-scripts/blob/main/docs/train_README-en.md#automatic-captioning 一、…

Springboot全文链路id,并ELK搭建部署整合全文链路id

Springboot全文链路id,并ELK搭建部署整合全文链路id 1.docker-compose.yaml部署 version: 3 services:elasticsearch:image: elasticsearch:7.13.2container_name: elasticsearchenvironment:- "cluster.nameelasticsearch" #设置集群名称为elasticsearch- "d…

[笔记]C++并发编程实战 《五》C++内存模型和原子类型操作

文章目录 前言第5章 C内存模型和原子类型操作5.1 内存模型基础5.1.1 对象和内存位置5.1.2 对象、内存位置和并发5.1.3 修改顺序 5.2 C中的原子操作和原子类型5.2.1 标准原子类型 总结 前言 第5章 C内存模型和原子类型操作 本章主要内容: C11内存模型详解标准库提…

【Docker】子系统与其相关名词的界定、Control Groups等详细讲解

前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 📕作者简介:热…

回收旧物系统平台开发的功能

1、定位服务 为了方便用户寻找最近的废品回收点,小程序应该提供位置服务和导航功能。 2、垃圾分类知识普及 用户可以查看所有垃圾分类知识,每种物品属于哪一个类型的垃圾分类。一目了然。相当于一本活字典,用户可以随时翻看查阅垃圾分类的…

人工智能(pytorch)搭建模型11-pytorch搭建DCGAN模型,一种生成对抗网络GAN的变体实际应用

大家好,我是微学AI,今天给大家介绍一下人工智能(pytorch)搭建模型11-pytorch搭建DCGAN模型,一种生成对抗网络GAN的变体实际应用,本文将具体介绍DCGAN模型的原理,并使用PyTorch搭建一个简单的DCGAN模型。我们将提供模型…

java+openlayer实现大气污染扩散模拟反演

一、模拟参数及效果 二、应用背景 大气污染是当今社会面临的一个重要问题。随着工业化和城市化的进程,大气污染问题变得越来越严重。为了更好地应对这个问题,许多科学家和研究人员开始探索大气污染扩散反演技术。 大气污染扩散反演技术是一种通过数学模…

给软件测试人的一封信,全网最佳“指路明灯“

一、一招鲜吃遍天下 你需要有一个核心技能。这个技能至少达到远超你的同事(包括开发岗位的同事的)平均水平。最好达到业界领先水平,且这个核心技能需要不断打磨提高。比如,我选择的核心技能是使用Python写代码。这个核心技能可以…

3.2 基于Java配置类整合SSM框架实现用户登录

一、基于Java配置类整合SSM框架实现用户登录 1、创建Maven项目 Maven项目 - SSMLoginNew 单击【Finish】按钮 2、添加相关依赖 在pom.xml文件里添加相关依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache…

Kubernetes 1.27 加快 Pod 启动速度

如何在大型集群中加快节点上的 Pod 启动&#xff1f;这是企业集群管理员常常会面临的问题。 这篇博文重点介绍了从 kubelet 一侧加快 Pod 启动的方法。此方法不涉及通过 kube-apiserver 由 controller-manager 创建 Pod 所用的时间段&#xff0c;也不包含 Pod 的调度时间或在其…

电脑最牛逼的截图方式

1.电脑桌面上空白的地方新建一个文本文档&#xff0c;将后缀名修改为bat&#xff0c;截图如下&#xff1a; 2.右键点击该文档编辑&#xff0c;在编辑界面输入start snippingtool&#xff0c;点击保存之后关闭该文档。 3.双击该文档&#xff0c;在模式里面选择响应的截图方式即可…

MySQL IDE与pymysql模块

一、IDE工具介绍 生产环境还是推荐使用mysql命令行&#xff0c;但为了方便我们测试&#xff0c;可以使用IDE工具 在此我们推荐使用Navicat软件或pycharm来连接数据库,这样就能更详细直观地查询数据 掌握&#xff1a; #1. 测试链接数据库 #2. 新建库 #3. 新建表&#xff0c;新增…

2023 年程序员高考试卷!你能答对几个?

又是一年高考季&#xff0c;一起来做做“程序员们的高考试卷”&#xff0c;压压惊吧~ 2023年普通高等学校招生全国统一考试 程序员的高考试卷&#xff08;A卷&#xff09; 考生类别&#xff1a;码农 1、程序员A&#xff1a;借我1000元吧。 程序员B&#xff1a;给你凑个整数…

Linux基础知识点2

Linux基础知识 适合有Linux基础的人群进行复习。 禁止转载&#xff01; 文件管理与常用命令 Linux的文件的组成部分&#xff1a; 文件名、inode(i节点)和block(真正存数据的区域)。 查看某个文件的属性&#xff1a; ls -lh #可看到有类似”-rw-r--r--”的属性符号 …

轻松来自实力,亚马逊云科技助力边界智能应对业务高峰值数据考验

边界智能&#xff08;Bianjie.AI&#xff09;是2016年创立于上海的国家高新技术企业和专精特新企业&#xff0c;同时也是以香港为全球总部、服务全球的区块链技术创新团队。公司专注于区块链技术支持的下一代互联网应用服务&#xff0c;自主研发了跨多条联盟链的分布式应用服务…