Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
ThinkPHP容器之容器是如何返回实例的_创想鸟

ThinkPHP容器之容器是如何返回实例的

“

在之前的文章中我们简单的梳理了一下容器类,接下来就是对其中一个细节进行深度分析。

”

Container实例调用make方法

本文没有太多文字解析,都在代码注释中说明了执行过程。

代码static::getInstance()返回了Container的实例后,就会去调用本类的make方法,接下来就是对make方法进行详解了。

ThinkPHP容器之容器是如何返回实例的在开始阅读make方法里边的源码之前,我们需要先对几个属性进行简单的梳理一下。

这四个属性一定要有点印象,并且一定要区别instance和instances。

这俩个属性一个是单例模式返回当前类的实例,一个是容器中的所有的实例。

ThinkPHP容器之容器是如何返回实例的第一次执行结果

   /**
* 创建类的实例
* @access public
* @param string $abstract 类名或者标识
* @param array|true $vars 变量
* @param bool $newInstance 是否每次创建新的实例
* @return object
*/

public function make($abstract, $vars = [], $newInstance = false)
{
// 判断$vars这个变量是否为true
if (true === $vars) {
// 总是创建新的实例化对象
$newInstance = true;
$vars = [];
}

// app 这里就是在容器别名里获取传递过来的app 如果没有则就是app
$abstract = isset($this->name[$abstract]) ? $this->name[$abstract] : $abstract;

// 从容器实例中获取 如果存在则直接返回对应的实例 也就是使用注册树模式
if (isset($this->instances[$abstract]) && !$newInstance) {
return $this->instances[$abstract];
}

// thinkApp 从容器标识中获取
if (isset($this->bind[$abstract])) {
// 将thinkApp 复制给$concrete变量
$concrete = $this->bind[$abstract];
// 用于代表匿名函数的类 判断是不是闭包
if ($concrete instanceof Closure) {
$object = $this->invokeFunction($concrete, $vars);
} else {
// $this->name['app'] = thinkApp
$this->name[$abstract] = $concrete;
// 在执行一次本类的make方法,也就是本方法
return $this->make($concrete, $vars, $newInstance);
}
} else {
$object = $this->invokeClass($abstract, $vars);
}

if (!$newInstance) {
$this->instances[$abstract] = $object;
}

return $object;
}

这是第二次执行流程

    public function make($abstract, $vars = [], $newInstance = false)
{
// 判断$vars这个变量是否为true
if (true === $vars) {
// 总是创建新的实例化对象
$newInstance = true;
$vars = [];
}

// app 这里就是在容器别名里获取传递过来的app 如果没有则就是app
// 第二次执行时 $abstract = thinkApp
$abstract = isset($this->name[$abstract]) ? $this->name[$abstract] : $abstract;

// 从容器实例中获取 如果存在则直接返回对应的实例 也就是使用注册树模式
if (isset($this->instances[$abstract]) && !$newInstance) {
return $this->instances[$abstract];
}

// thinkApp 从容器标识中获取
// 第二次执行$this->bind['thinkApp']不存在走else
if (isset($this->bind[$abstract])) {
// 将thinkApp 复制给$concrete变量
$concrete = $this->bind[$abstract];
// 用于代表匿名函数的类 判断是不是闭包
if ($concrete instanceof Closure) {
$object = $this->invokeFunction($concrete, $vars);
} else {
// $this->name['app'] = thinkApp
$this->name[$abstract] = $concrete;
// 在执行一次本类的make方法,也就是本方法
// thinkApp
return $this->make($concrete, $vars, $newInstance);
}
} else {
// thinkApp
$object = $this->invokeClass($abstract, $vars);
}

if (!$newInstance) {
// 把创建的容器存起来
//$this->instances['thinkApp'] = $object;
$this->instances[$abstract] = $object;
}

return $object;
}
public function invokeClass($class, $vars = [])
{
try {

/**
* ReflectionClass Object
(
[name] => thinkApp
)
*/

// 这里就是之前文章提到的反射
$reflect = new ReflectionClass($class);


if ($reflect->hasMethod('__make')) {
$method = new ReflectionMethod($class, '__make');

if ($method->isPublic() && $method->isStatic()) {
$args = $this->bindParams($method, $vars);
return $method->invokeArgs(null, $args);
}
}
// 通过反射获取thinkApp的构造函数
$constructor = $reflect->getConstructor();

$args = $constructor ? $this->bindParams($constructor, $vars) : [];
// 从给出的参数创建一个新的类实例
return $reflect->newInstanceArgs($args);

} catch (ReflectionException $e) {
throw new ClassNotFoundException('class not exists: ' . $class, $class);
}
}

执行流程图

既然把代码都理清楚了,这时来理一下执行的流程图可以看的更清晰。

ThinkPHP容器之容器是如何返回实例的

“

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

”

以上就是ThinkPHP容器之容器是如何返回实例的的详细内容,更多请关注创想鸟其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Spring Boot项目启动时如何正确加载外部JAR包?
上一篇 2025年11月5日 22:40:10
蚂蚁与中国人民大学发布首个原生 MoE 扩散语言模型
下一篇 2025年11月5日 22:40:18

相关推荐

  • ThinkPHP6.0管道模式与中间件的实现分析

    说明 ThinkPHP 6.0 RC5 开始使用了管道模式来实现中间件,比起之前版本的实现更加简洁、有序。这篇文章对其实现细节进行分析。 首先我们从入口文件 public/index.php 开始,$http = (new App())->http; 获得一个 http 类的实例后调用它的 r…

    2026年9月25日
    000
  • thinkphp开发用什么IDE?

    thinkphp开发用什么IDE?thinkphp开发用什么IDE?thinkphp开发用什么IDE?thinkphp开发用什么IDE?

    thinkphp开发用什么ide? Zend Studio Zend Studio是一款来自Zend公司旗下的一款经典PHP IDE。 Zend Studio是一个屡获大奖的专业PHP集成开发环境,具备功能强大的专业编辑工具和调试工具,支持PHP语法加亮显示,支持语法自动填充功能,支持书签功能,支持…

    2026年9月25日 • 用户投稿
    200
  • workerman与thinkphp结合使用的方法

    workerman与thinkphp结合使用的方法workerman与thinkphp结合使用的方法workerman与thinkphp结合使用的方法workerman与thinkphp结合使用的方法

    下面由workerman入门教程栏目给大家介绍将workerman与thinkphp结合的方法,希望对大家有一定的帮助。 运行workerman需要安装pcntl和event或者libevent pcntl安装方法: 以php-5.5.20为例,实际情况按自己安装的PHP目录 立即学习“PHP免费学…

    2026年9月25日 • 用户投稿
    200
  • 如何在ThinkPHP6中使用Shardig数据库

    在现代web应用程序的开发过程中,数据量通常很大,为了应对这种情况并提升数据库性能,通常会采用分库分表的方式进行数据管理。sharding数据库则是一种常见的实现方式,它可以将数据分散在多个不同的数据库集群上进行管理,以此实现数据的高可用性和性能提升。本文将介绍如何在thinkphp6中使用shar…

    用户投稿 2026年9月24日
    000
  • 在ThinkPHP6中使用权限控制技术

    权限控制技术在现代web应用程序开发中越来越重要。它可以帮助开发者管理用户权限、控制数据访问和保护系统安全。而thinkphp6是一个强大的php框架,提供了多种权限控制技术,本文将介绍其中的一些。 认证与授权 在ThinkPHP6中,认证和授权是两个不同的概念。认证通常是指验证用户的身份,判断用户…

    用户投稿 2026年9月24日
    100
  • 如何在ThinkPHP6中使用MongoDB进行数据存储

    随着互联网的不断发展,数据的存储和处理越来越成为一个重要的方向。而mongodb则是一种适用于大规模数据和高性能应用场景的nosql数据库,它的高性能和可扩展性得到了众多开发者的拥护。在这篇文章中,我们将介绍如何在thinkphp6中使用mongodb进行数据存储。 一、安装MongoDB拓展 首先…

    用户投稿 2026年9月24日
    100
  • MySQL中SQL注入防范 SQL注入攻击的预防与应对措施

    sql注入的防范核心在于参数化查询。具体措施包括:1.始终使用参数化查询,将用户输入视为数据而非可执行代码;2.对输入进行过滤与校验,如验证格式、转义特殊字符;3.遵循最小权限原则,限制数据库账号权限;4.控制错误信息输出,避免暴露敏感细节;5.定期更新框架与插件,及时修补漏洞。这些方法结合使用能有…

    2026年9月24日
    100
  • 如何使用ThinkPHP6实现验证码功能

    在网站或应用的登录、注册、找回密码等登录认证系统当中,验证码功能已经成为常见的一种用户验证方式。验证码功能能够有效防止恶意攻击和机器人攻击,保护用户数据和系统安全。本文将介绍如何使用thinkphp6框架实现验证码功能。 一、ThinkPHP6验证码功能介绍 ThinkPHP6框架中的验证码功能可以…

    用户投稿 2026年9月24日
    000
  • 利用ThinkPHP6实现动态配置

    随着互联网技术的不断发展,如何快速、灵活地配置系统已成为开发人员的必修课。因此,动态配置已经成为现代软件开发的重要组成部分。在这篇文章中,我们将介绍如何使用thinkphp6实现动态配置的方法。 一、什么是动态配置? 动态配置是通过代码实现对系统的配置进行修改的过程。传统的系统配置一般需要修改配置文…

    用户投稿 2026年9月24日
    000
  • ThinkPHP6发送推送通知:实现用户消息推送

    ThinkPHP6发送推送通知:实现用户消息推送 引言:在现代的Web应用程序中,消息推送已成为提供实时通知和即时更新的重要功能之一。用户在操作过程中会收到及时的消息提醒,提升用户体验和交互性。本文将介绍如何在ThinkPHP6框架中实现用户消息推送功能,并附带代码示例。 一、准备工作 确保已经安装…

    2026年9月21日
    000
  • ThinkPHP6用户登录与注册:实现用户认证功能

    ThinkPHP6用户登录与注册:实现用户认证功能 引言:用户登录与注册是大多数Web应用程序的常见需求之一。在ThinkPHP6中,通过使用内置的用户认证功能可以轻松实现用户的登录与注册操作。本文将介绍如何在ThinkPHP6中实现用户的认证功能,并附上代码示例。 一、用户认证功能简介用户认证是指…

    2026年9月21日
    300
  • ThinkPHP6接口限流与防刷:保护接口的安全性

    ThinkPHP6接口限流与防刷:保护接口的安全性 在现代互联网应用中,接口的使用越来越广泛,很多应用都依赖于各种接口来进行数据传输和交互。然而,由于接口的开放性和便利性,也容易成为攻击者的目标,因此保护接口的安全性变得至关重要。在ThinkPHP6框架中,提供了一些防护机制和限制措施,帮助我们有效…

    2026年9月21日
    200
  • 自定义协议与主流框架(如ThinkPHP)结合

    在thinkphp中实现自定义协议可以通过中间件机制。具体步骤包括:1. 创建中间件类customprotocolmiddleware,解析和验证请求的json格式和字段。2. 在应用配置文件中添加该中间件,使所有请求经过处理。通过这种方式,可以满足特定业务需求并提升应用的灵活性和可扩展性。 在开发…

    2026年9月21日
    000
  • ThinkPHP生产环境部署的注意事项

    在生产环境中部署thinkphp应用需要注意以下几点:1.确保服务器环境满足thinkphp要求,使用php 7.2+和支持的web服务器;2.配置php.ini和application/config.php文件,关闭调试模式,设置合适的日志级别和数据库连接;3.采取安全措施,保护应用目录结构,使用…

    2026年9月21日
    200
  • 使用ThinkPHP构建RESTful API的规范

    使用thinkphp可以构建符合restful api规范的应用。1)定义路由和控制器来处理请求,如get用户信息。2)使用中间件处理认证。3)利用缓存机制优化性能。通过这些步骤,thinkphp支持快速、高效地构建restful api。 你想知道如何使用ThinkPHP来构建一个符合RESTfu…

    2026年9月20日
    100
  • ThinkPHP6聊天室开发指南:实现实时通讯功能

    ThinkPHP6聊天室开发指南:实现实时通讯功能 引言:随着互联网的快速发展,实时通讯的需求也越来越大。聊天室作为一种常见的实时通讯方式,受到了广泛的关注和使用。本文将通过使用ThinkPHP6框架,为大家提供一种简单、快速实现实时通讯功能的方法。 一、环境配置:在开始之前,我们需要配置好开发环境…

    2026年9月20日
    000
  • ThinkPHP的Composer依赖如何管理?ThinkPHP如何引入第三方库?

    ThinkPHP的Composer依赖如何管理?ThinkPHP如何引入第三方库?ThinkPHP的Composer依赖如何管理?ThinkPHP如何引入第三方库?ThinkPHP的Composer依赖如何管理?ThinkPHP如何引入第三方库?ThinkPHP的Composer依赖如何管理?ThinkPHP如何引入第三方库?

    thinkphp对composer依赖的管理与第三方库的引入,核心机制围绕composer包管理器展开。首先,项目根目录需有composer.json文件,可通过composer create-project命令创建项目自动生成。其次,使用composer require vendor/packag…

    2026年9月12日 • 用户投稿
    100
  • ThinkPHP的API开发怎么实现?ThinkPHP如何返回JSON数据?

    ThinkPHP的API开发怎么实现?ThinkPHP如何返回JSON数据?ThinkPHP的API开发怎么实现?ThinkPHP如何返回JSON数据?ThinkPHP的API开发怎么实现?ThinkPHP如何返回JSON数据?ThinkPHP的API开发怎么实现?ThinkPHP如何返回JSON数据?

    在thinkphp中实现api开发的核心在于路由规划、控制器处理与统一响应结构。1. 首先,创建独立模块如app/api,并在route/api.php中定义restful或自定义路由,将请求指向对应控制器方法;2. 控制器继承basecontroller,不渲染视图,通过request()-&gt…

    2026年9月12日 • 用户投稿
    200
  • ThinkPHP的钩子怎么使用?ThinkPHP如何实现事件监听?

    ThinkPHP的钩子怎么使用?ThinkPHP如何实现事件监听?ThinkPHP的钩子怎么使用?ThinkPHP如何实现事件监听?ThinkPHP的钩子怎么使用?ThinkPHP如何实现事件监听?ThinkPHP的钩子怎么使用?ThinkPHP如何实现事件监听?

    thinkphp通过事件系统实现事件监听和“钩子”功能,允许在不修改核心代码的情况下插入自定义逻辑。具体步骤包括:1. 定义事件,如 ‘user_login_success’;2. 创建监听器类,如 useractivitylog,并编写响应方法;3. 在 config/ev…

    2026年9月12日 • 用户投稿
    000
  • ThinkPHP的验证器怎么用?ThinkPHP如何验证表单数据?

    ThinkPHP的验证器怎么用?ThinkPHP如何验证表单数据?ThinkPHP的验证器怎么用?ThinkPHP如何验证表单数据?ThinkPHP的验证器怎么用?ThinkPHP如何验证表单数据?ThinkPHP的验证器怎么用?ThinkPHP如何验证表单数据?

    thinkphp验证器是用于检查用户提交数据是否符合预设规则的工具,保障数据有效性及应用安全。其通过定义规则类实现字段验证,支持内置规则、自定义规则及错误信息处理。1. 内置规则包括require、email、alphanum、length、unique等;2. 自定义规则可通过闭包、独立函数或va…

    2026年9月12日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信