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

这篇具有很好参考价值的文章主要介绍了ThinkPHP5源码阅读-类的自动加载register与autoload的实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

本文已收录于PHP全栈系列专栏:PHP快速入门与实战

ThinkPHP是国内最流行的一款PHP框架,是国人自主研发的框架,起源于2006年,经过了十几年的不断发展。已经成为了一款被PHP广泛认可的性能开发效率兼具的利器。
ThinkPHP5源码阅读-类的自动加载register与autoload的实现

阅读框架源码有助于我们更好的学习语言基础,拓展设计模式等相关能力。同时很多设计与编码的思想也能更好的指导我们日常工作,尤其是想成为资深程序员或者架构师方面的同事,
这是一个必须要学习的过程。今天是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文件夹下面,如下图。
ThinkPHP5源码阅读-类的自动加载register与autoload的实现

类的准备

现在我们通过xdebug,一步一步来跟踪tp5是如何实现类的自动加载的。

进入base.php

首先走到 thinkphp/base.php 这一行,进入。
ThinkPHP5源码阅读-类的自动加载register与autoload的实现

Loader::register() 注册自动加载函数

现在进入到base.php文件。可以看到这里便引入了Loader.php,引入之后调用Loader静态方法register()进行类的自动加载注册。
ThinkPHP5源码阅读-类的自动加载register与autoload的实现
接下来进入register()看看到底干了什么事情。通过下图可以看到,先通过php底层方法spl_autoload_register声明,这个函数的作用是如果找不到类,尝试走哪一个方法进行类加载。这个方法之前有一篇文章我讲到过,有需要可以到我博客翻一翻。
ThinkPHP5源码阅读-类的自动加载register与autoload的实现

对composer 的支持

上面86行处提到了composer自动加载支持,这里是重点,告诉了我们tp5是如何找到composer里面的类。大家可以翻阅自己项目下面的vendor/composer/autoload_static.php这个文件,这个文件里面在执行composer install或者update之后会同步更新,它告诉了框架,当前composer管理了哪些php包,并且应该按照何种方式加入到框架。可以见下图。
ThinkPHP5源码阅读-类的自动加载register与autoload的实现

对think和trait的支持

接下来通过addNamespace把think和trait这两个tp5本身自带的类库增加自动化加载配置。
ThinkPHP5源码阅读-类的自动加载register与autoload的实现

对extend目录的支持

然后再register()方法最后,将extend目录也自动放入加载路径。这就是为什么在根目录下面的extend里面的类能够被自动识别和加载的原因。
ThinkPHP5源码阅读-类的自动加载register与autoload的实现

前面所有的操作就是把所有的类找到并且做好映射并存储到prefixLengthsPsr4,prefixesPsr0这些静态变量上面去,后面就来讲解怎么使用他们。

类的加载

autoload方法

上面部分内容我们已经知道think\\Loader::autoload这个方法来进行处理类加载,其实就是Loader.php本类的一个方法。然后我们跟踪进去autoload()方法。见下图。
ThinkPHP5源码阅读-类的自动加载register与autoload的实现

class_alias的定义和使用

class_alias是类的别名,别名注册同样来自于base.php。使用别名可以非常方便的简化我们的使用,可以看到,tp5的很多自定义方法都是通过别名进行注册的。看到这里,是不是觉得有些理解Config这些是怎么实现的呢。别着急,后面其他章节会讲到。今天不作为重点。
ThinkPHP5源码阅读-类的自动加载register与autoload的实现

findFile 查找类

下面继续阅读Loader里面findFile这个方法。其实现逻辑就是通过前面已经维护好的类映射关系去不断寻找命中命名空间的类。直到找到位置。
ThinkPHP5源码阅读-类的自动加载register与autoload的实现

作业:自定义一个可以被自动类加载的目录。

阅读了上面的源码,不难发现,比如要根目录下面的tool目录能够被自动类加载,只需要在extend目录的支持的地方将tool目录放进去就可以了。

总结

以上就是关于本篇文章介绍的内容,ThinkPHP5源码阅读-类的自动加载register与autoload的实现,后续更多内容将收录在专栏PHP快速入门与实战中,感谢大家支持。喜欢记得三联哟。文章来源地址https://www.toymoban.com/news/detail-480269.html

到了这里,关于ThinkPHP5源码阅读-类的自动加载register与autoload的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • thinkphp5拦截验证token

    写一个BaseController 类 基本思路: 1、继承一个公共基类,将验证相关代码放在基类 2、根据 孩子类下的notNeedToken 来决定是否进行验证 3、验证失败后,直接响应回来 这里需要封装一个主要代码: 如果直接return 返回,是不会终止执行的,而是会继续执行到指定的控制器,所以

    2024年02月15日
    浏览(45)
  • thinkPhp5返回某些指定字段

    或者指定要的字段的数组  查询符合条件的多条数据  

    2024年02月09日
    浏览(46)
  • ThinkPHP5远程命令执行漏洞

    ThinkPHP是一个快速、兼容而且简单的轻量级国产 PHP开发框架 ,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,使用面向对象的开发结构和 MVC模式 ,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式。 由于th

    2024年02月11日
    浏览(48)
  • Thinkphp5.x全漏洞复现分析

    我们可以把namespace理解为一个单独的空间,事实上它也就是一个空间而已,子命名空间那就是空间里再划分几个小空间,举个例子: 当有多个子命名空间有相同名称类时,不指定使用哪个命名空间的情况下取最后定义的命名空间中的类,比如上面的 dog 取的时 dogC 中的类,在

    2024年04月22日
    浏览(46)
  • ThinkPHP5系列远程代码执行漏洞复现(详细)

    ThinkPHP是一款运用极广的PHP开发框架。其版本5中,由于框架对控制器名没有进行足够的检测,会导致在没有开启强制路由的情况下可执行任意方法,从而导致远程命令执行漏洞。 漏洞危害 启动环境 切换到/thinkphp/5.0.23-rce# 目录下 将version改为2,保存并退出 接着执行 此时环境

    2024年02月12日
    浏览(44)
  • ThinkPHP5.0.23 远程代码执行漏洞

    ThinkPHP 是一款运用极广的 PHP 开发框架。其 5.0.23 以前的版本中,获取 method 的方法中没有正确处理方法名,导致攻击者可以调用 Request 类任意方法并构造利用链,从而导致远程代码执行漏洞。 百度漏洞 获得exp 路径: POST传参 我用的是hackbar,用burpsuite也行。 burp操作方法 抓包

    2024年02月11日
    浏览(46)
  • ThinkPHP5.0.21远程命令执行漏洞

    漏洞出现的背景 : ThinkPHP是⼀款运⽤极⼴的PHP开发框架。 其5.0.23以前的版本中,获取method的⽅法中没有正确处理⽅法名, 导致攻击者可以调⽤Request类任意⽅法并构造利⽤链,从⽽导致远程代码执⾏漏洞。 由于ThinkPHP5框架对控制器名没有进⾏⾜够的安全检测,导致在没有开

    2024年02月04日
    浏览(47)
  • 知识笔记(九十)———ThinkPHP5中时间查询的方法

    使用 where 方法 where 方法支持时间比较,例如: 第三个参数可以传入任何有效的时间表达式,会自动识别你的时间字段类型,支持的时间类型包括 timestamps 、 datetime 、 date 和 int 。 使用 whereTime 方法 whereTime 方法提供了日期和时间字段的快捷查询,示例如下: 还提供了更方便

    2024年01月21日
    浏览(56)
  • PHP客服系统聊天页面-thinkphp加载页面源码解释

    PHP workerman客服系统加载聊天页面的代码逻辑流程,可以进行参考。如果想要二开修改的,可以根据这个流程来修改。 thinkphp的router部分 查看控制器加载页面逻辑 application/index/controller/Index.php public function chat 函数里php处理部分 页面路径为:application/index/view/index/cli_box.html

    2024年02月14日
    浏览(46)
  • thinkphp5.0.24反序列化漏洞分析

    thinkphp5框架: thinkphp5的入口文件在 publicindex.php ,访问 反序列化起点 写一个反序列化入口点 全局搜索 __destruct() 函数 thinkphp_5.0.24thinkphplibrarythinkprocesspipesWindows.php 中的 __destruct() 函数,调用了removeFiles() 跟进removeFiles(),第163行的file_exists可以触发 __toString 方法 全局搜索

    2023年04月08日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包