ThinkPHP之玩转自己的容器类

发布时间 - 2020-10-12 00:00:00    点击率:

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

五、玩转自己的容器类

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

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

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

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

在这里插入图片描述

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

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

反射之战优化代码

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

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

/**
* Created by PhpStorm.
* User: 咔咔
* Date: 2025/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 :2025/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] => container\dependency\Car
)
*/

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

}else{
// container\dependency\Car
$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  # 编辑器  # 咔咔  # 在这里  # 这个时候  # 会报  # 自己的  # 都是  # 插入图片  # 我是  # 来了 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在IIS中新建站点并配置端口与物理路径?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  JavaScript如何实现继承_有哪些常用方法  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  jQuery 常见小例汇总  如何在宝塔面板创建新站点?  韩国服务器如何优化跨境访问实现高效连接?  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  香港服务器网站卡顿?如何解决网络延迟与负载问题?  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  如何在 React 中条件性地遍历数组并渲染元素  大学网站设计制作软件有哪些,如何将网站制作成自己app?  如何快速生成高效建站系统源代码?  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  如何利用DOS批处理实现定时关机操作详解  node.js报错:Cannot find module 'ejs'的解决办法  如何打造高效商业网站?建站目的决定转化率  如何快速登录WAP自助建站平台?  如何在万网开始建站?分步指南解析  如何用VPS主机快速搭建个人网站?  香港服务器租用每月最低只需15元?  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  Python文件操作最佳实践_稳定性说明【指导】  如何快速建站并高效导出源代码?  javascript基本数据类型及类型检测常用方法小结  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  html5的keygen标签为什么废弃_替代方案说明【解答】  高端网站建设与定制开发一站式解决方案 中企动力  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  Android自定义listview布局实现上拉加载下拉刷新功能  网站制作壁纸教程视频,电脑壁纸网站?  长沙做网站要多少钱,长沙国安网络怎么样?  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  北京专业网站制作设计师招聘,北京白云观官方网站?  lovemo网页版地址 lovemo官网手机登录  青岛网站建设如何选择本地服务器?  如何基于云服务器快速搭建个人网站?  北京网站制作的公司有哪些,北京白云观官方网站?  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制