IOC容器实现
时间:2022-07-23
本文章向大家介绍IOC容器实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
interface MConfig
{
public function getConfig();
}
class MysqlConfig implements MConfig
{
public function getConfig()
{
// 获取配置
return ['host', 'name', 'pwd'];
}
}
interface RConfig
{
public function getConfig();
}
class RedisConfig implements RConfig
{
public function getConfig()
{
// 获取配置
return ['host', 'name', 'pwd'];
}
}
interface SMysql
{
public function query();
}
class DbMysql implements SMysql
{
public $config;
public function __construct(MConfig $config)
{
$this->config = $config->getConfig();
// do something
}
public function query()
{
echo __METHOD__ . PHP_EOL;
}
}
interface SRedis
{
public function Set();
}
class DbRedis implements SRedis
{
public function __construct(RConfig $config)
{
$this->config = $config->getConfig();
// do something
}
public function set()
{
echo __METHOD__ . PHP_EOL;
}
}
class Controller
{
public $mysql;
public $redis;
public function __construct(SMysql $mysql, SRedis $redis)
{
$this->mysql = $mysql;
$this->redis = $redis;
}
public function action()
{
is_object($this->mysql) && $this->mysql->query();
is_object($this->redis) && $this->redis->set();
}
}
class Container
{
public $bindings = [];
public function bind($key, $value)
{
if (!$value instanceof Closure) {
$this->bindings[$key] = $this->getClosure($value);
} else {
$this->bindings[$key] = $value;
}
}
public function getClosure($value)
{
return function () use ($value) {
return $this->build($value);
};
}
public function make($key)
{
if (isset($this->bindings[$key])) {
return $this->build($this->bindings[$key]);
}
return $this->build($key);
}
public function build($value)
{
if ($value instanceof Closure) {
return $value();
}
// 实例化反射类
$reflection = new ReflectionClass($value);
// isInstantiable() 方法判断类是否可以实例化
$isInstantiable = $reflection->isInstantiable();
if ($isInstantiable) {
// getConstructor() 方法获取类的构造函数,为NULL没有构造函数
$constructor = $reflection->getConstructor();
if (is_null($constructor)) {
// 没有构造函数直接实例化对象返回
return new $value;
} else {
// 有构造函数
$params = $constructor->getParameters();
if (empty($params)) {
// 构造函数没有参数,直接实例化对象返回
return new $value;
} else {
$dependencies = [];
// 构造函数有参数
foreach ($params as $param) {
$dependency = $param->getClass();
if (is_null($dependency)) {
// 构造函数参数不为class,返回NULL
$dependencies[] = NULL;
} else {
// 类存在创建类实例
$dependencies[] = $this->make($param->getClass()->name);
}
}
return $reflection->newInstanceArgs($dependencies);
}
}
}
return null;
}
}
$app = new Container();
$app->bind('MConfig', 'MysqlConfig');
$app->bind('RConfig', 'RedisConfig');
$app->bind('SMysql', 'DbMysql');
$app->bind('SRedis', 'DbRedis');
$app->bind('controller', 'Controller');
$controller = $app->make('controller');
$controller->action();
- python两个 list 获取交集,并集,差集的方法.
- python——时间与时间戳之间的转换
- Maven 核心原理解析(3)
- String中的null,以及String s;等区别详解
- Shell编程——Shell中的数学运算
- 如何利用微信监管你的TF训练?
- python 安装spark_Spark环境搭建 (Python)
- MongoDB触发oom-killer的简单处理(一)(r7笔记第54天)
- int与integer的区别
- java 自动装箱与拆箱
- python读取文件——python读取和保存mat文件
- python 利用递归实现全排列
- java中 == 与 equal 的区别
- python基础知识——字符串
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android自定义图文跑马灯效果
- Android自定义View实现可展开、会呼吸的按钮
- Android仿google now效果的呼吸按钮
- Kotlin中双冒号::使用方法
- android实现简单左滑删除控件
- Android几种多渠道打包的步骤详解
- RadioButton实现选择后可取消选择
- Android数字选择器NumberPicker使用详解
- Listvie简单实现购物车功能
- RXjava网络获取图片数据的方法
- VerticalBannerView仿淘宝头条实现垂直轮播广告
- ViewFlipper实现文字轮播效果
- Android自定义ViewFlipper实现滚动效果
- ViewFlipper实现上下翻滚轮播效果
- android实现长图加载效果