ThinkPHP容器源码深度解析(3)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: ThinkPHP容器源码深度解析

五、玩转自己的容器类

经历了九九八十一难终于来到了容器这一环节,在这一环节我们先来实现一个自己的容器,将之前讲解的单例模式、注册树模式、反射进行一个串联,从而进行加深印象和更好的理解。


还记得之前在依赖注入里边说过这样一个方法dependency,这个方法就是进行了依赖注入,从而对代码进行解耦。


image.png


但是这次呢!会使用容器来解决这一问题。


首先先把需要的类定义好,这一个类就使用了单例模式和注册树模式,之前的文章没有好好看的,一定要仔细看一下,否则后文会很难理解的。


image.png

image.png

image.png

<?php
/**
 * Created by PhpStorm.
 * User: 咔咔
 * Date: 2020/9/21
 * Time: 19:04
 */
namespace container;
class Container
{
    /**
     * 存放容器
     * @var array
     */
    public $instances = [];
    /**
     * 容器的对象实例
     * @var array
     */
    protected static $instance;
    /**
     * 定义一个私有的构造函数防止外部类实例化
     * Container constructor.
     */
    private function __construct() {
    }
    /**
     * 获取当前容器的实例(单例模式)
     * @return array|Container
     */
    public static function getInstance ()
    {
        if(is_null(self::$instance)){
            self::$instance = new self();
        }
        return self::$instance;
    }
    public function set ($key,$value)
    {
        return $this->instances[$key] = $value;
    }
    public function get ($key)
    {
        return $this->instances[$key];
    }
}

为了方便以后查看方便,这里把每节的案例演示都放在对应的控制器中


这里把之前的依赖注入的代码移植过来,并且配置上注解路由进行访问,看最终结果是否为Car方法返回的123


image.png


测试一下打印结果,一切ok


image.png

使用单例模式和注册树模式配合后修改的这份代码


修改后打印出其结果,同样也是car返回的值123。


在这里需要注意一下就是在同一个方法中set和get方法是不会共存的,这里只是为了给大家做一个演示写到一起的。


后边在看容器源码时就知道set和get方法到底是怎么使用的,这里只是让大家体验一下单例模式和注册树模式。


image.png


这里做一个小修改,修改上文中最后俩行代码

image.png

image.png




场景二


此时我们把Person 的文件修改一下


添加一个构造函数,把参数使用构造函数进行赋值,在buy方法中就不需要在进行传递参数,只需要使用this->obj即可。


image.png


此时如果还是直接运行dependency路由就会报下边一个错,那是因为在Person中构造函数有个参数,的但是我们没有传。


image.png


此时就需要在修改一处,就是在实例化Person时把Car的实例当参数给传进去就没有任何问题了。


image.png


但是你会发现上边这都是什么代码,本来简简单单的几行代码被复杂成这个样子,这个时候就已经弊大于利了,不管设计模式在好,盲目的使用对项目来说也是一种负担。


所以这个时候反射就来了,反射在上文中也进行简单的介绍过,一定要看哈!文章都是一环套着一环的。



相关文章
|
3天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
14 2
|
3天前
|
存储 安全 Linux
Golang的GMP调度模型与源码解析
【11月更文挑战第11天】GMP 调度模型是 Go 语言运行时系统的核心部分,用于高效管理和调度大量协程(goroutine)。它通过少量的操作系统线程(M)和逻辑处理器(P)来调度大量的轻量级协程(G),从而实现高性能的并发处理。GMP 模型通过本地队列和全局队列来减少锁竞争,提高调度效率。在 Go 源码中,`runtime.h` 文件定义了关键数据结构,`schedule()` 和 `findrunnable()` 函数实现了核心调度逻辑。通过深入研究 GMP 模型,可以更好地理解 Go 语言的并发机制。
|
16天前
|
消息中间件 缓存 安全
Future与FutureTask源码解析,接口阻塞问题及解决方案
【11月更文挑战第5天】在Java开发中,多线程编程是提高系统并发性能和资源利用率的重要手段。然而,多线程编程也带来了诸如线程安全、死锁、接口阻塞等一系列复杂问题。本文将深度剖析多线程优化技巧、Future与FutureTask的源码、接口阻塞问题及解决方案,并通过具体业务场景和Java代码示例进行实战演示。
36 3
|
24天前
|
缓存 前端开发 JavaScript
前端的全栈之路Meteor篇(二):容器化开发环境下的meteor工程架构解析
本文详细介绍了使用Docker创建Meteor项目的准备工作与步骤,解析了容器化Meteor项目的目录结构,包括工程准备、环境配置、容器启动及项目架构分析。提供了最佳实践建议,适合初学者参考学习。项目代码已托管至GitCode,方便读者实践与交流。
|
28天前
|
存储 应用服务中间件 云计算
深入解析:云计算中的容器化技术——Docker实战指南
【10月更文挑战第14天】深入解析:云计算中的容器化技术——Docker实战指南
52 1
|
30天前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
65 0
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
66 0
|
1月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
52 0
|
1月前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
59 0
|
1月前
|
安全 Java 程序员
Collection-Stack&Queue源码解析
Collection-Stack&Queue源码解析
80 0

推荐镜像

更多