PHP - DI 的使用

DI 是什么.这里不在陈述.百度,谷歌上有很多资料

这里使用开源的DI组件库 php-DI

DI库开箱即用版本

确保你的电脑安装了composer.composer require php-di/php-diindex.php

require('vendor/autoload.php');

use DI\ContainerBuilder;

$builder = new ContainerBuilder();

$builder->addDefinitions(__DIR__ . '/config.php');

$container = $builder->build();

$proxy = $container->get('tt');

$proxy->doSomething();config.php

require 'test.class.php';

return [

tt::class => function () {

return new test();

},

tt1::class => function () {

var_dump(333);

return new test();

}

]test.class.php;

class test {

public function dosomething(){

var_dump(123123);

}

}

?>

解释:$builder->addDefinitions(__DIR__ . '/config.php'); //config.php 设置需要注入的类

$container = $builder->build();

$proxy = $container->get('tt'); //获取注入的类.ps: 使用的是别名

$proxy 就是test.class.php 的实例化的对象. 可以自行用 instanceof

if ( $proxy instanceof new test.class.php ) { } 去试试.但是记得引入test.class.php

有的人可能会问.这一个一个的require 不要疯掉..

接下来. 整合到实际项目中..在你的单入口处 引入容器require_once "kingphp/di/DI.class.php"; // DI容器DI.class.php

use DI\ContainerBuilder;

/**

* DI::get('log')->addError('error');

* DI::get('event')->emit('user.refer',array(['roomid'=>'1']));

*/

class DI {

private static $dibuild = '';

// 自动加载

public static function autoload( $class_name )

{

//自动加载类文件的方法.一些简单的判断.文件是否存在,类是否存在.可自行自定义.也可以使用comonser 的autoload.php 可自行百度关键词.composer加载自己的类.![1486449923.png](http://oizlltfdh.bkt.clouddn.com/2017/02/3490788300.png)

$class_path = str_replace("\\",DIRECTORY_SEPARATOR,$class_name);

if( empty( $class_path ) || !is_file( $class_path ) )

{

$class_path = $class_path.'.php';

}

if ( is_file($class_path) ) {

require_once ($class_path);

if(class_exists($class_name,false)){

return true;

}

}

return false;

}

/**

* 创建DI 对象

*/

public static function create() {

if( empty(self::$dibuild) ) {

spl_autoload_register('self::autoload');

$builder = new ContainerBuilder();

$builder->addDefinitions(__DIR__ . '/config.php');

$container = $builder->build();

self::$dibuild = $container;

}

return self::$dibuild;

}

/**

* 获取DI 对象

*/

public static function get( $className = '' ) {

$di = self::create();

return $di->get( $className );

}

}

?>config.php

use kingphp\event\listener;

use Monolog\Logger;

use Monolog\Handler\StreamHandler;

use Monolog\Formatter\LineFormatter;

return [

event::class => function () {

return listener::create();

},

log::class =>function () {

$log = new Logger('name');

$formatter = new LineFormatter();

$sterm = new StreamHandler('var/log/mongolog.log', Logger::DEBUG);

$sterm->setFormatter($formatter);

$log->pushHandler($sterm);

return $log;

}

]

?>

然后你就可以在你的MVC中到处使用 DI::get('log')->addError('error');了

解释:注入类到 '容器' 中是在config.php文件中.

我这里注入的时候自己写了一个自动加载类使用的是spl_autoload_register();

获取容器中的类 DI::get('log')->addError('error');

本文由 舒舒 创作,采用 知识共享署名4.0 国际许可协议进行许可

本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名

最后编辑时间为: Feb 9, 2017 at 10:20 am

php di 使用,PHP - DI 的使用相关推荐

  1. 彻底理解Spring IOC和DI

    目录 前言 1. 分享Iteye的开涛对Ioc的精彩讲解 1.1 IoC是什么 1.2 IoC能做什么 1.3 IoC和DI 2. 分享Bromon的blog上对IoC与DI浅显易懂的讲解 2.1 I ...

  2. php写一个轻量级的容器,PHP写的一个轻量级的DI容器类

    直接上代码吧. Di容器类: class Di implements \ArrayAccess{ private $_bindings = array();//服务列表 private $_insta ...

  3. php di,PHP-DI中文文档(基于有道翻译,基本是直接拿过来使用,并没有润色)

    Getting started with PHP-DI (开始使用PHP-DI) Welcome! This guide will help you get started with using PH ...

  4. IOC和DI 控制反转和依赖注入

    首先要分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文,原文地址:http://jinnianshilongnian.iteye.com/b ...

  5. PHP写的一个轻量级的DI容器类(转)

    理解什么是Di/IoC,依赖注入/控制反转.两者说的是一个东西,是当下流行的一种设计模式.大致的意思就是,准备一个盒子(容器),事先将项目中可能用到的类扔进去,在项目中直接从容器中拿,也就是避免了直接 ...

  6. DI是实现面向切面和面向抽象的前提

    DI越来越重要 DI就是依赖注入,现在来说,大部分框架都是以DI为基础组件的,每一个框架都有自己的DI组件,像dotnet core,java spring等,也都为自己的框架量身打造了DI工具. 面 ...

  7. DIP原则、IoC以及DI

    一.DIP原则 高层模块不应该依赖于底层模块,二者都应该依赖于抽象. 抽象不应该依赖于细节,细节应该依赖于抽象. 该原则理解起来稍微有点抽象,我们可以将该原则通俗的理解为:"依赖于抽象&qu ...

  8. 再谈angularjs DI(Dependency Injection)

    在前面已经介绍了关于angularjs,以及扩展了一些jQuery ui的一些组件为angularjs的directive.在这里应进口007 在上篇留言我们来看看在angularjs中的DI特性. ...

  9. PHP依赖注入(DI)和控制反转(IoC)详解

    这篇文章主要介绍了PHP依赖注入(DI)和控制反转(IoC)的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程 ...

最新文章

  1. NLP-Progress记录NLP最新数据集、论文和代码: 助你紧跟NLP前沿
  2. 液晶显示屏怎么显示泰文_液晶显示屏概念股大涨 液晶显示屏概念股一览表
  3. 二十九、Node.js连接Mysql和MongoDB数据库CURD操作
  4. 数据库Mysql的学习(六)-子查询和多表操作
  5. Vue-cli 3.X 构建工具零基础快速上手
  6. mysql备份:一,Xtrabackup
  7. 超分辨率算法大战!AI in RTC 创新挑战赛——20万巨奖等你来拿!
  8. 跨区域报考计算机考试可以吗,考生注意!2020年医师资格机考跨题型不可以回看(附上机操作系统)...
  9. 4.在屏幕上输出以下图案: * *** ***** ******* ********* *********** ************* *********** *********
  10. 雷霆战机单机老版本_雷霆战机单机版
  11. 工业相机与镜头选型方法(含实例)
  12. 【防火墙流控配置 基于主机的带宽控制】
  13. OA项目之Mybatis多表链接查询
  14. ES内存溢出,报错:java.lang.OutOfMemoryError: Java heap space
  15. poi生成excel整理(设置边框/字体/颜色/加粗/居中/)
  16. linux远程kill进程
  17. 最新计算机安全参考文献,最新计算机络安全参考文献 计算机络安全期刊参考文献哪里找...
  18. 视频去水印工具-视频去水印哪个软件好用
  19. python伪装浏览器什么意思_python浏览器伪装
  20. 自创小说《彩虹雨》 连载(四)

热门文章

  1. 路径规划算法1.1图搜索算法——可视图法
  2. AI又进化了,声音克隆革命性突破
  3. apache tomcat下32还是64_Windows操作系统从win7升级到win 10,该选择32位还是64位?
  4. javaFX登录注册GUI
  5. 小米前端开发实习生一面
  6. javascript 、Jquery 拆分字符串
  7. 【机器学习自学笔记6】高斯混合模型(GMM)
  8. 英语早教启蒙的三大误区,你踩雷了吗
  9. win10电脑wlan打不开
  10. 更改TabLayout选中的背景色