php di 使用,PHP - DI 的使用
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 的使用相关推荐
- 彻底理解Spring IOC和DI
目录 前言 1. 分享Iteye的开涛对Ioc的精彩讲解 1.1 IoC是什么 1.2 IoC能做什么 1.3 IoC和DI 2. 分享Bromon的blog上对IoC与DI浅显易懂的讲解 2.1 I ...
- php写一个轻量级的容器,PHP写的一个轻量级的DI容器类
直接上代码吧. Di容器类: class Di implements \ArrayAccess{ private $_bindings = array();//服务列表 private $_insta ...
- php di,PHP-DI中文文档(基于有道翻译,基本是直接拿过来使用,并没有润色)
Getting started with PHP-DI (开始使用PHP-DI) Welcome! This guide will help you get started with using PH ...
- IOC和DI 控制反转和依赖注入
首先要分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文,原文地址:http://jinnianshilongnian.iteye.com/b ...
- PHP写的一个轻量级的DI容器类(转)
理解什么是Di/IoC,依赖注入/控制反转.两者说的是一个东西,是当下流行的一种设计模式.大致的意思就是,准备一个盒子(容器),事先将项目中可能用到的类扔进去,在项目中直接从容器中拿,也就是避免了直接 ...
- DI是实现面向切面和面向抽象的前提
DI越来越重要 DI就是依赖注入,现在来说,大部分框架都是以DI为基础组件的,每一个框架都有自己的DI组件,像dotnet core,java spring等,也都为自己的框架量身打造了DI工具. 面 ...
- DIP原则、IoC以及DI
一.DIP原则 高层模块不应该依赖于底层模块,二者都应该依赖于抽象. 抽象不应该依赖于细节,细节应该依赖于抽象. 该原则理解起来稍微有点抽象,我们可以将该原则通俗的理解为:"依赖于抽象&qu ...
- 再谈angularjs DI(Dependency Injection)
在前面已经介绍了关于angularjs,以及扩展了一些jQuery ui的一些组件为angularjs的directive.在这里应进口007 在上篇留言我们来看看在angularjs中的DI特性. ...
- PHP依赖注入(DI)和控制反转(IoC)详解
这篇文章主要介绍了PHP依赖注入(DI)和控制反转(IoC)的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程 ...
最新文章
- NLP-Progress记录NLP最新数据集、论文和代码: 助你紧跟NLP前沿
- 液晶显示屏怎么显示泰文_液晶显示屏概念股大涨 液晶显示屏概念股一览表
- 二十九、Node.js连接Mysql和MongoDB数据库CURD操作
- 数据库Mysql的学习(六)-子查询和多表操作
- Vue-cli 3.X 构建工具零基础快速上手
- mysql备份:一,Xtrabackup
- 超分辨率算法大战!AI in RTC 创新挑战赛——20万巨奖等你来拿!
- 跨区域报考计算机考试可以吗,考生注意!2020年医师资格机考跨题型不可以回看(附上机操作系统)...
- 4.在屏幕上输出以下图案: * *** ***** ******* ********* *********** ************* *********** *********
- 雷霆战机单机老版本_雷霆战机单机版
- 工业相机与镜头选型方法(含实例)
- 【防火墙流控配置 基于主机的带宽控制】
- OA项目之Mybatis多表链接查询
- ES内存溢出,报错:java.lang.OutOfMemoryError: Java heap space
- poi生成excel整理(设置边框/字体/颜色/加粗/居中/)
- linux远程kill进程
- 最新计算机安全参考文献,最新计算机络安全参考文献 计算机络安全期刊参考文献哪里找...
- 视频去水印工具-视频去水印哪个软件好用
- python伪装浏览器什么意思_python浏览器伪装
- 自创小说《彩虹雨》 连载(四)