ThinkPHP6源码:从Http类的实例化看依赖注入是如何实现的

本文深入剖析ThinkPHP6框架的Http类实例化过程,揭示依赖注入的实现原理。从入口文件开始,通过App类的构造函数、__get()魔术方法、Container的make()方法,逐步解释如何自动实例化类并处理依赖关系,展示了现代PHP框架如何简化复杂的依赖管理。
摘要由CSDN通过智能技术生成

ThinkPHP 6 从原先的 App 类中分离出 Http 类,负责应用的初始化和调度等功能,而 App 类则专注于容器的管理,符合单一职责原则。

以下源码分析,我们可以从 AppHttp 类的实例化过程,了解类是如何实现自动实例化的,依赖注入是怎么实现的。

我的官方群点击此处

从入口文件出发

当访问一个 ThinkPHP 搭建的站点,框架最先是从入口文件开始的,然后才是应用初始化、路由解析、控制器调用和响应输出等操作。

入口文件主要代码如下:

// 引入自动加载器,实现类的自动加载功能(PSR4标准)

// 对比Laravel、Yii2、Thinkphp的自动加载实现,它们基本就都一样

// 具体实现可参考我之前写的Laravel的自动加载实现:

// @link: https://learnku.com/articles/20816

require __DIR__ . '/../vendor/autoload.php';

// 这一句和分为两部分分析,App的实例化和调用「http」,具体见下文分析

$http = (new App())->http;

$response = $http->run();

$response->send();

$http->end($response);

App 实例化

执行 new App() 实例化时,首先会调用它的构造函数。

public function __construct(string $rootPath = '')

{

    // thinkPath目录:如,D:\dev\tp6\vendor\topthink\framework\src\

    $this->thinkPath   = dirname(__DIR__) . DIRECTORY_SEPARATOR;

    // 项目根目录,如:D:\dev\tp6\

    $this->rootPath    = $rootPath ? rtrim($rootPath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR : $this->getDefaultRootPath();

    $this->appPath     = $this->rootPath . 'app' . DIRECTORY_SEPARATOR;

    $this->runtimePath = $this->rootPath . 'runtime' . DIRECTORY_SEPARATOR;

    // 如果存在「绑定类库到容器」文件

    if (is_file($this->appPath . 'provider.php')) {

        //将文件里的所有映射合并到容器的「$bind」成员变量中

        $this->bind(include $this->appPath . 'provider.php');

    }

    //将当前容器实例保存到成员变量「$instance」中,也就是容器自己保存自己的一个实例

    static::setInstance($this);

    // 保存绑定的实例到「$instances」数组中,见对应分析

    $this->instance('app', $this);

    $this->instance('think\Container', $this);

}

构造函数实现了项目各种基础路径的初始化,并读取了

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值