ThinkPHP之玩转自己的容器类

本文将实现一个简单的容器类

五、玩转自己的容器类

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

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

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

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

在这里插入图片描述
在这里插入图片描述

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

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

反射之战优化代码

最终优化完成的代码就是这样的,接下来对这段代码进行简单的解析。

在之前代码的基础上只修改了kaka/container/Container.php这个类里边的get方法
判断这个名person是否在容器中
使用反射接口,然后获取传进去person类的构造方法
如果person没有构造方法就直接返回person这个实例即可
如存person在构造函数,则获取person构造函数的方法
由于person类里边的构造函数的参数不会仅限于一个
所以需要循环来获取每个参数的对象
最后使用反射的newInstanceArgs接口创建对应的实例
<?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;
}

/**
* User : 咔咔
* Notes: 获取容器里边的实例 使用反射
* Time :2020/9/21 22:04
* @param $key
* @return mixed
*/

public function get ($key)
{
if(!empty($this->instances[$key])){
$key = $this->instances[$key];
}

$reflect = new ReflectionClass($key);
// 获取类的构造函数
$c = $reflect->getConstructor();
if(!$c){
return new $key;
}

// 获取构造函数的参数
$params = $c->getParameters();
foreach ($params as $param) {
/**
ReflectionClass Object
(
[name] => containerdependencyCar
)
*/

$class = $param->getClass();
if(!$class){

}else{
// containerdependencyCar
$args[] = $this->get($class->name);
}
}
// 从给出的参数创建一个新的类实例
return $reflect->newInstanceArgs($args);
}
}

在这里插入图片描述文件application/index/controller/Container.php这里就是修改之后的变动

在这里插入图片描述问题一:kaka/container/dependency/Person.php里边的参数Car是什么意思

这个问题其实很简单,你可以看到这个Car就是同目录的Car.php文件。你就可以直接理解为同命名空间下的文件。

在这里插入图片描述问题二:文件application/index/controller/Container.php为什么可以直接调用buy方法

首先看一下obj的值,返回的这个对象里边就已经把Car的类实例化好了,所以无需在实例化,可直接调用buy方法,因为参数会直接传递过去

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述以上就是咔咔实现的一个简单的容器,如有不明白或者问题可以直接评论区回复即可。

接下来就是针对框架里边的容器进行剖析,一步一步的追溯到根源。

坚持学习、坚持写博、坚持分享是咔咔从业以来一直所秉持的信念。希望在偌大互联网中咔咔的文章能带给你一丝丝帮助。我是咔咔,下期见。

以上就是ThinkPHP之玩转自己的容器类的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/351891.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
完美记忆宝珠速刷全攻略:秘境副本与武学真传的终极指南
上一篇 2025年11月5日 22:41:19
千千静听如何设置透明度
下一篇 2025年11月5日 22:41:24

相关推荐

  • thinkphp怎么使用

    ThinkPHP 是一款 PHP MVC 框架,用于快速开发 Web 应用。安装步骤:1. 下载 ThinkPHP;2. 解压到 Web 根目录;3. 配置 Web 服务器指向 ThinkPHP 文件夹;4. 配置数据库信息、应用模式和缓存设置;5. 创建应用程序模块,包含控制器、模型和视图;6. …

    2026年8月29日
    100
  • thinkphp手册怎么使用

    使用 ThinkPHP 手册的方法:访问官方网站并选择对应版本文档。根据目录结构查阅特定类、方法或编程指导。使用搜索功能或浏览示例代码获取具体用法。参与社区讨论或使用 Google 搜索查找其他信息。拓展资源包括中文社区、文档翻译和 GitHub 仓库。 如何使用 ThinkPHP 手册 一、入门指…

    2026年8月29日
    200
  • thinkphp框架使用教程

    本教程逐步指导如何使用 ThinkPHP 框架构建 Web 应用程序:安装 ThinkPHP 并创建应用程序。配置数据库连接。创建模型和控制器。创建视图。配置路由规则。运行应用程序,ThinkPHP 将自动加载控制器和操作方法。渲染视图,在浏览器中显示数据。 ThinkPHP 框架使用教程 Thin…

    2026年8月29日
    000
  • thinkphp workerman

    ThinkPHP 和 Workerman 结合可实现 PHP 实时应用:实时通信:支持聊天、推送通知等功能;高并发性:异步架构可处理大量连接;低延迟:非阻塞 I/O 模型提高响应能力。集成步骤:安装 Swoole 扩展;创建 Worker 服务;在入口脚本中启动 Worker 服务。 ThinkPH…

    2026年8月29日
    100
  • thinkphp5有什么功能

    ThinkPHP 5 是一款开源 PHP 框架,提供以下核心功能:MVC 架构:清晰的代码组织和重用。ORM:使用面向对象语法简化数据库操作。路由:轻松定义和管理应用程序 URL。模板引擎:轻松创建和渲染视图。验证:防止恶意攻击和验证用户输入。此外,ThinkPHP 5 还提供高级功能,例如数据库连…

    2026年8月29日
    000
  • thinkphp swoole教程

    ThinkPHP框架集成的Swoole教程通过五个步骤讲解如何在ThinkPHP应用中使用Swoole:安装扩展、配置框架、创建控制器、配置路由,最后运行应用。Swoole以其高并发能力、异步通信和低内存占用优势,显著提升了PHP应用的性能。 ThinkPHP框架下的Swoole教程 什么是Swoo…

    2026年8月29日
    000
  • thinkphp怎么样 thinkphp怎么使用教程

    ThinkPHP 是一款平衡优雅与高效的 PHP 框架。采用约定优于配置的设计理念,减少配置文件编写量,提高开发速度。采用 MVC 架构,分层代码,提高可维护性和可重用性。学习曲线较陡峭,需要投入时间理解其机制。迭代更新频繁,可能存在不兼容性,需关注更新。性能优化需合理利用缓存、索引和数据库连接池。…

    2026年8月29日
    000
  • thinkphp如何防止sql注入教程

    ThinkPHP中SQL注入防护需要多管齐下:使用ThinkPHP提供的参数绑定和预编译语句等安全机制。输入验证:使用ThinkPHP验证器进行数据类型验证、长度限制和特殊字符过滤。最小权限原则:限制数据库用户的权限。输出转义:输出数据时进行转义,防止XSS攻击。 ThinkPHP安全:SQL注入防…

    2026年8月29日
    100
  • thinkphp开发的软件如何安装 thinkphp如何安装教程

    ThinkPHP软件安装主要有Composer安装和手动下载安装两种方式,其中推荐使用Composer安装。在安装过程中,需要确保PHP环境配置正确,包括PHP版本、数据库连接等;同时也要注意权限问题、环境依赖和版本兼容性。掌握细节,排查常见问题,熟练使用Composer安装,才能成为ThinkPH…

    2026年8月29日
    1000
  • thinkphp怎么实现分页教程

    ThinkPHP分页的核心在于SQL LIMIT子句,paginate()方法封装了底层数据库查询和数据处理。它允许自定义分页样式和参数,并提供性能优化技巧,如使用缓存、数据库优化和避免N+1问题,以应对复杂的分页场景。 ThinkPHP分页:不止是paginate()那么简单 很多朋友觉得Thin…

    2026年8月29日
    300
  • thinkphp怎么连接数据库详细步骤

    ThinkPHP数据库连接:配置: 在database.php配置文件中设置连接参数,如数据库类型、用户名和密码。连接机制: 通过Db类面向对象操作数据库,无需直接与数据库驱动程序交互。连接池: 启用连接池以复用连接,提高效率。错误处理: 加入完善的错误处理机制,防止程序崩溃。性能优化: 使用连接池…

    2026年8月29日
    100
  • 如何查看thinkphp版本 thinkphp版本查看教程

    如何查看 ThinkPHP 版本?查看项目根目录下的 thinkphp/base.php 文件中 ‘version’ 配置项。在控制器或模型中调用 thinkVersion::getVersion() 方法。查看 composer.json 文件中的 ThinkPHP 依赖声…

    2026年8月29日
    000
  • ThinkPHP 队列(Queue)与异步任务处理

    在thinkphp中,可以使用队列来处理异步任务。具体方法包括:1.定义任务类并实现fire方法;2.使用queue::push方法将任务推送到队列中;3.通过配置驱动(如redis或数据库)来管理和执行任务。这种方式可以有效提升应用性能和用户体验。 引言 在现代Web开发中,异步任务处理和队列管理…

    2026年8月29日
    100
  • ThinkPHP 6 环境配置(Nginx/Apache + PHP 8)

    配置 thinkphp 6 环境需要在 nginx 或 apache 上结合 php 8 进行设置。1) nginx 配置:编辑 nginx.conf 文件,设置 server 块以正确处理 php 文件。2) apache 配置:在 httpd.conf 文件中添加 virtualhost 配置,…

    2026年8月29日
    200
  • ThinkPHP6缓存驱动应用指南:选择合适的缓存驱动

    ThinkPHP6缓存驱动应用指南:选择合适的缓存驱动 在使用ThinkPHP6框架进行开发时,缓存的使用是提高应用性能的一种重要手段。ThinkPHP6提供了丰富的缓存驱动选项,开发者可以根据自己的需求选择合适的缓存驱动来提高应用的响应速度和性能。本文将介绍ThinkPHP6中常用的缓存驱动以及它…

    2026年8月28日
    100
  • ThinkPHP 数据库迁移与填充(Migration & Seeder)

    在 thinkphp 中,如何进行数据库迁移和填充?1. 使用命令行工具创建和运行迁移文件。2. 通过 seeder 文件向数据库插入初始数据。3. 优化时使用批量操作和事务管理,确保代码可读性和维护性。通过这些步骤,可以有效管理数据库结构和数据。 引言 在这个不断变化的软件开发世界中,数据库的结构…

    2026年8月28日
    100
  • ThinkPHP 数据库连接与查询构造器实战

    在 thinkphp 中进行数据库操作的方法包括:1. 通过配置文件和 db 类连接数据库;2. 使用查询构造器构建 sql 查询;3. 执行 crud 操作;4. 进行关联查询;5. 调试和优化查询性能;6. 应用性能优化策略和最佳实践。 引言 在当今的 Web 开发领域,ThinkPHP 作为一…

    2026年8月28日
    000
  • ThinkPHP 日志管理与错误监控(Sentry集成)

    在thinkphp中实现高效的日志管理和错误监控可以通过以下步骤实现:1)配置thinkphp的log.php文件,定义日志类型、存储路径和记录级别;2)通过composer.json安装sentry sdk,并在应用中初始化sentry,设置dsn以捕获和发送异常到sentry服务器;3)使用th…

    2026年8月28日
    100
  • ThinkPHP ORM 详解:模型操作与关联查询

    thinkphp 的 orm 系统通过模型操作和关联查询提高开发效率。1)模型操作:通过对象方式操作数据库,如创建用户并保存。2)关联查询:支持多种关联类型,允许通过模型关系查询数据,如用户与文章的一对多关联。使用 thinkphp 的 orm 可以简化开发过程并高效处理复杂数据关系。 引言 在现代…

    2026年8月28日
    000
  • ThinkPHP 性能优化:10个提升速度的技巧

    提升thinkphp应用性能的10个技巧包括:1.优化数据库查询,减少查询次数;2.使用缓存策略,降低数据库负载;3.实施延迟加载,减少初始加载时间;4.进行批量操作,减少数据库连接次数;5.避免n+1查询问题,使用关联查询;6.优化模板渲染,使用缓存模板;7.启用编译模式,提升启动速度;8.优化日…

    2026年8月28日
    100

发表回复

登录后才能评论
关注微信