php DI实现实例:

<?php
//DI  主要运用IoC用于解决 依赖文件共享(无需每一个依赖都手动注册)

//管理应用程序中的『全局』对象(包括实例化、处理依赖关系)。
//可以延时加载对象(仅用到时才创建对象)。
//促进编写可重用、可测试和松耦合的代码。

class di{
    private $_definitions=[];//保存依赖定义
    private $_dependencies=[];//保存依赖信息
    private $_singletons=[];//用于保存单例
    private $_reflections=[];//用于缓存(依赖)实例
    private $_params=[];//保存构造函数的参数

    public function set($class,$dependencies=[],$params=[]){
        //注册一个类 声明它的 类名、依赖类、构造实例的参数
        $this->_definitions[$class]=$class;
        $this->_dependencies[$class]=$dependencies;
        $this->_params[$class]=$params;
    }

/***
  * 创建依赖实例方法
  * $class 创建实例的类名
  * $params 创建实例的依赖参数
  * $config 创建实例的配置
***/
    public function build($class,$params=[],$config=[]){
        //验证依赖--递归创建
        $this->validate($class);

        //将实例化的类储存到 公用类库
        $this->_reflections[$class]=new $class($this->validate_create($class));
    }
    public function get($class,$config=[]){
        //验证依赖--递归创建
        $this->validate($class);
        //最终返回结果
        return new $class($this->validate_create($class));
    }

    //用于验证依赖并创建
    public function validate($class,$params=[],$config=[]){
        if(isset($this->_dependencies[$class])){
            //是否存在依赖信息--如果存在创建新对象 储存到库
            foreach($this->_dependencies[$class] as $v){
                $this->build($v);//创建依赖
            }
        }
    }
    //最终创建对象前 验证参数配置并构成
    public function validate_create($class){
        $arr=[];
        //判断是否存在依赖属性
        if(isset($this->_params[$class])){
        //将类名和的依赖类 对应
            foreach($this->_params[$class] as $v){
                //从公共库取出实例加入参数
                $arr[$v]=$this->_reflections[$v];
            }
        }
        return $arr;
    }

}

//测试类
class test{
    protected $_word;
    protected $_else;

    public function __construct($class){
        foreach($class as $k=>$v){
            if($v instanceof jk1){
                $this->_word=$v;
            }elseif($v instanceof jk2){
                $this->_else=$v;
            }
        }
    }

    public function say1(){
        $this->_word->jk1_say();
    }
    public function say2(){
        $this->_else->jk2_say();
    }
}
//定义两个依赖接口
interface jk1{
     public function jk1_say();
}
interface jk2{
     public function jk2_say();
}
//两个例子
class my_jk1 implements jk1{
    protected $obj;
    public function __construct($class){
        foreach($class as $k=>$v){
            $this->obj=$v;
        }
    }
    public function jk1_say(){
        echo $this->obj->abc();
    }
}
class my_jk2 implements jk2{
    public function jk2_say(){
        echo __METHOD__;
    }
}

//my_jk1的依赖
class my_jk1_ext{
    public function abc(){
        echo __METHOD__;
    }
}

$di =new di;
$di->set(‘my_jk1‘,[‘my_jk1_ext‘],[‘my_jk1_ext‘]);//添加关系
$di->set(‘test‘,[‘my_jk1‘,‘my_jk2‘],[‘my_jk1‘,‘my_jk2‘]);

$a=$di->get(‘test‘);
$a->say1();
echo "<hr>";
$a->say2();
时间: 2024-11-05 21:44:21

php DI实现实例:的相关文章

Spring DI基础实例解析

1.        在程序中提供需要依赖Spring为其注入属性的属性名和类型 package com.hao947.ioc; public class UserService { private String name; private String year; public void setName(String name) { this.name = name; } public void setYear(String year) { this.year = year; } public

《Prism 5.0源码走读》UnityBootstrapper

UnityBootstrapper (abstract class)继承自Bootstrapper(abstract)类, 在Prism.UnityExtensions.Desktop project中.主要是为了支持Unity Container(Dependency Injection Container). 打开UnityBoostrapper源代码我们可以看到这里面主要有以下逻辑: 1. 定义Unity Container属性 public IUnityContainer Contain

ASP.NET Core 打造一个简单的图书馆管理系统(三)基本登录页面以及授权逻辑的建立

前言: 本系列文章主要为我之前所学知识的一次微小的实践,以我学校图书馆管理系统为雏形所作. 本系列文章主要参考资料: 微软文档:https://docs.microsoft.com/zh-cn/aspnet/core/getting-started/?view=aspnetcore-2.1&tabs=windows <Pro ASP.NET MVC 5>.<Bootstrap 开发精解>.<锋利的 jQuery> 此系列皆使用 VS2017+C# 作为开发环境.

Redis 群集部署

一.Redis群集相关概念Redis是从3.0版本开始支持cluter的,采用的是hash槽方式,可以将多个Redis实例整合在一起,形成一个群集,也就是将数据分散存储到群集中的多个节点上. Redis的cluster是一个无中心的结构,在群集中,每个master的身份是平等的,每个节点都保存数据和整个群集的状态,并且知道其他节点所负责的槽,也会定时发送心跳信息,能够及时感知群集中异常的节点,并且采取投票的方式来决定该节点是否为不可用,若票数为群集中节点的半数以上,则认为该节点不可用,也正是因为

Redis群集部署

一.Redis群集相关概念Redis是从3.0版本开始支持cluter的,采用的是hash槽方式,可以将多个Redis实例整合在一起,形成一个群集,也就是将数据分散存储到群集中的多个节点上.Redis的cluster是一个无中心的结构,在群集中,每个master的身份是平等的,每个节点都保存数据和整个群集的状态,并且知道其他节点所负责的槽,也会定时发送心跳信息,能够及时感知群集中异常的节点,并且采取投票的方式来决定该节点是否为不可用,若票数为群集中节点的半数以上,则认为该节点不可用,也正是因为此

iOS控制反转(IoC)与依赖注入(DI)的实现

背景 最近接触了一段时间的SpringMVC,对其控制反转(IoC)和依赖注入(DI)印象深刻,此后便一直在思考如何使用OC语言较好的实现这两个功能.Java语言自带的注解特性为IoC和DI带来了极大的方便,要在OC上较好的实现这两个功能,需要一些小小的技巧. 控制反转和依赖注入 控制反转 简单来说,将一个类对象的创建由手动new方式改为从IOC容器内获取,就是一种控制反转,例如我们现在要创建一个ClassA类,则常规方法为 ClassA *a = [ClassA new]; 如果使用控制反转,

IOC与DI的区别

一.IOC介绍 1.IOC是控制反转. 2.传统资源查找方式:要求组件向容器发起请求,查找资源作为回应,容器适时返回资源. 3.IOC查找方式:容器会主动将资源提供给它所管理的组件,组件只需要选择一个合适的方式来接收资源,也被称为查找的被动式. 4.创建对象实例的控制权从代码控制剥离到IOC容器控制(之前的写法,由程序代码直接操控使用new关键字),实际就是你在xml文件控制,控制权的转移是所谓反转,侧重于原理. 二.DI介绍 1.DI是依赖注入 2.IOC的另一种表达方式:组件以一些预先定义好

Spring+IOC(DI)+AOP概念及优缺点

Spring pring是一个轻量级的DI和AOP容器框架. 说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于spring开发的应用一般不依赖于spring的类. 容器:Spring是个容器,因为它包含并且管理应用对象的生命周期和配置.如对象的创建.销毁.回调等. 框架:Spring作为一个框架,提供了一些基础功能,(如事务管理,持久层集成等),使开发人员更专注于开发应用逻辑. Spring的优点1.降低了组件之间的耦合性 ,

谈谈php里的IOC控制反转,DI依赖注入

理论 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(Inversion of Control,缩写为IoC):是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度. 依赖注入(Dependency Injection,简称DI):DI是IOC的一种实现,表现为:在类A的实例创建过程中即创建了依赖的B对象,通过类型或名称来判断将不同的对象注入到不同的属