文档章节

php 依赖注入

酱油_coder
 酱油_coder
发布于 2015/12/30 11:11
字数 676
阅读 47
收藏 0
点赞 0
评论 0

传统的思路是应用程序在用到一个类的时候,就会创建这个类的对象并且调用方法。如果这个方法里面需要一个bar的类,那么就需要

new一个bar的对象去进行调用。。。bar类中还需要调用bim的类,那么就还需要new一个bim的类去进行调用。

<?php// 代码【1】classBim{    publicfunctiondoSomething(){        echo__METHOD__, '|';
    }
}classBar{    publicfunctiondoSomething(){        $bim = new Bim();        $bim->doSomething();        echo__METHOD__, '|';
    }
}classFoo{    publicfunctiondoSomething(){        $bar = new Bar();        $bar->doSomething();        echo__METHOD__;
    }
}$foo = new Foo();$foo->doSomething(); // Bim::doSomething|Bar::doSomething|Foo::doSomething

使用依赖注入的思路是应用程序中用到foo类,foo类需要用bar类,bar类需要用到bim类。那么先创建bim类,在创建bar类,把bim类注入到bar中,然后创建foo类,将bar注入到foo中。

<?php// 代码【2】class Bim{    public function doSomething()
    {        echo __METHOD__, '|';
    }
}class Bar{    private $bim;    public function __construct(Bim $bim)
    {        $this->bim = $bim;
    }    public function doSomething()
    {        $this->bim->doSomething();        echo __METHOD__, '|';
    }
}class Foo{    private $bar;    public function __construct(Bar $bar)
    {        $this->bar = $bar;
    }    public function doSomething()
    {        $this->bar->doSomething();        echo __METHOD__;
    }
}$foo = new Foo(new Bar(new Bim()));$foo->doSomething(); // Bim::doSomething|Bar::doSomething|Foo::doSomething

以上代码说的就是控制反转模式。依赖关系的控制反转到调用链的起点。这样就可以完全空值依赖关系,通过调整不同注入对象来控制程序的行为。

通过一个最简单的容器类来解释一下,这段代码来自 Twittee

<?phpclass Container{    private $s = array();    function __set($k, $c)
    {        $this->s[$k] = $c;
    }    function __get($k)
    {        return $this->s[$k]($this);
    }
}

这段代码使用了魔术方法,在给不可访问属性赋值时,__set() 会被调用。读取不可访问属性的值时,__get() 会被调用。

<?php$c = new Container();$c->bim = function () {    return new Bim();
};$c->bar = function ($c) {    return new Bar($c->bim);
};$c->foo = function ($c) {    return new Foo($c->bar);
};// 从容器中取得Foo$foo = $c->foo;$foo->doSomething(); // Bim::doSomething|Bar::doSomething|Foo::doSomething

这段代码使用了匿名函数

再来一段简单的代码演示一下,容器代码来自simple di container

<?phpclass IoC{    protected static $registry = [];    public static function bind($name, Callable $resolver)
    {        static::$registry[$name] = $resolver;
    }    public static function make($name)
    {        if (isset(static::$registry[$name])) {            $resolver = static::$registry[$name];            return $resolver();
        }        throw new Exception('Alias does not exist in the IoC registry.');
    }
}

IoC::bind('bim', function () {    return new Bim();
});
IoC::bind('bar', function () {    return new Bar(IoC::make('bim'));
});
IoC::bind('foo', function () {    return new Foo(IoC::make('bar'));
});// 从容器中取得Foo$foo = IoC::make('foo');$foo->doSomething(); // Bim::doSomething|Bar::doSomething|Foo::doSomething

这段代码使用了后期静态绑定

依赖注入容器 (dependency injection container) 高级功能

真实的dependency injection container会提供更多的特性,如

  • 自动绑定(Autowiring)或 自动解析(Automatic Resolution)

  • 注释解析器(Annotations)

  • 延迟注入(Lazy injection)



不过说实话 这些东西 没写过。。要写过才知道



© 著作权归作者所有

共有 人打赏支持
酱油_coder
粉丝 0
博文 9
码字总数 9953
作品 0
武汉
程序员
什么是依赖注入?

这篇文章是关于一般依赖关系注入和在PHP中实现依赖注入容器系列的第一部分。 今天我不会谈论容器然而我想以一些具体的示例介绍依赖注入的概念希望说明尝试去解决问题和它给开发者带来的好处。...

v8v9v3000
2014/05/07
0
0
依赖注入的简单记录

想理解php依赖注入和控制反转两个概念,就必须搞清楚如下的问题: DI——Dependency Injection 依赖注入 IoC——Inversion of Control 控制反转 1、参与者都有谁?  IOC/DI容器就是一个全局...

金于虎
2016/12/23
4
1
php中的数种依赖注入

经常看到却一直不甚理解的概念,依赖注入(DI)以及控制器反转(Ioc),找了几篇好的文章,分享一下。 自己理解的,依赖注入就是组件通过构造器,方法或者属性字段来获取相应的依赖对象。 举个现...

杨太化
2015/10/13
47
0
PHP反射机制实现自动依赖注入

转自 http://blog.csdn.net/qq_20678155/article/details/70158374 依赖注入又叫控制反转,使用过框架的人应该都不陌生。很多人一看名字就觉得是非常高大上的东西,就对它望而却步,今天抽空...

E狼
2017/12/10
0
0
PHP中的依赖注入(DI)容器

介绍 我们已经介绍过了PHP 反射API,阐明了什么是反射API,以及它的不同用途,其中一种 - 最常见的是将其与 一起使用,以下是本文的主要内容: 什么是依赖注入 注入对象的不同方式(以及为什...

如来神掌
06/03
0
0
php 容器和依赖注入容器

最近研究php的框架,知道了依赖注入容器。但是一直弄不清楚怎么回事。依赖注入和控制反转,看代码我的理解是主要用来解耦的,简单说是把关联对象的接口或父抽象类在外部创立,以参数形式注入到...

manbudezhu
2016/08/05
258
0
JesusSlim/partini

partini a php web application framework used pinject. 一个基于pinject实现的phpweb框架 usage 使用composer安装 composer require jesussim/partini 参考 example . 基于pinject,php依赖......

JesusSlim
2016/07/31
0
0
PHPer、Laravel常见面试题及答案

最近社区里面有一篇文章引起了最多程序猿的关注,分享一下 Laravel、PHPer 面试可能会遇到的问题,看评论区不少小伙伴们被难倒,对于一些问题同样难倒了我(其实有很多啦),趁着周末有空,又...

angkee
2017/09/24
0
0
从零开始理解 Laravel 依赖注入

大家在使用 Laravel 的过程中,可能会感觉到在 Laravel 里很多神奇的东西会发生。依赖注入似乎是一个。但它真的很神奇吗? Laravel 容器(Container) Laravel中的服务容器其实就是一个依赖注入...

如来神掌
05/30
0
0
laravel依赖注入和控制反转

依赖注入与控制反转 依赖注入 当我第一次接触这个词的时候,我是有些丈二和尚摸不着头脑的,至今我也是感到比较困惑的,所以今天我们来探索一下Laravel中的, 来好好的理解它。 控制反转 第一...

eatnothing
2016/05/15
525
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CDH的坑之Sqoop导出数据到MySQL

CDH的坑之Sqoop导出数据到MySQL 最近使用Sqoop从Hive导出数据到MySQL中,出现了一系列的问题,下面将这个问题记录一下,避免再度踩坑! 导出语句 sqoop export --connect jdbc:mysql://192....

星汉
7分钟前
0
0
Hyperledger Fabric 客户端开发三

前面两篇文章介绍了Hyperledger Fabric SDK并使用一个实例介绍如何通过SDK和Hyperledger Fabric Blockchain交互, 现在详细分析相关的过程。 首先看 enroll (登录) admin 过程。 'use stric...

十一月不远
7分钟前
0
0
PowerDesigner连接MySQL和逆向工程图

最近想梳理公司项目的表间关系,从项目后台管理系统的操作入手,以及代码的hibernate注解入手,都不算特别尽人意,于是最后还是鼓捣了一下PowerDesigner的逆向工程图,这样更直观一些。 想着...

Oo若离oO
8分钟前
0
0
威胁web应用安全的错误

一般绝大部分的web应用攻击都是没特定目标的大范围漏洞扫描,只有少数攻击确实是为入侵特定目标而进行的针对性尝试。这两种攻击都非常频繁,难以准确检测出来,许多网站的web应用防火墙都无法...

上树的熊
10分钟前
2
0
pypy2 install crypto error

install pycryptodome instead pip install pycryptodome

coord
14分钟前
0
0
Service Mesh所应对的8项挑战

Lori Macvittie 微服务架构是把双刃剑,我们享受它带来的开发速度(development velocity),却也不得不面对服务间通讯带来的复杂性问题。 目前大多数扩展容器化微服务的架构多是基于proxy-b...

好雨云帮
23分钟前
0
0
时间复杂度

1. 维基上的定义 在计算机科学中,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低...

liuyan_lc
29分钟前
0
0
js中的~符

~是js里的按位取反操作符,~~就是执行两次按位取反,其实就是保持原值,但是注意虽然是原值,但是对布尔型变量执行这个操作,会转化成相应的数值型变量,也就是 ~~true === 1,~~false === 0...

JamesView
30分钟前
0
0
webpack安装

npm install --save-dev webpack-cli

Vincent-Duan
32分钟前
0
0
实时监听EditText内容变化

主要是addTextChangedListener方法的使用 aswerEdittext.addTextChangedListener(new TextWatcher() { //编辑框的内容发生改变之前的回调方法 @Override public void before...

王先森oO
35分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部