资讯专栏INFORMATION COLUMN

PHP依赖注入(代码全篇)

felix0913 / 668人阅读

摘要:依赖注入传统的思路应用程序用到一个类就会创建类并调用类的方法。这样你可以完全控制依赖关系,通过调整不同的注入对象,来控制程序的行为。例如类用到了,可以在不修改类代码的情况下,改用。

依赖注入

传统的思路

应用程序用到一个Foo类,就会创建Foo类并调用Foo类的方法。
假如这个方法内需要一个Bar类,就会创建Bar类并调用Bar类的方法。
而这个方法内需要一个Bim类,就会创建Bim类,接着做些其它工作。

/**
*  Foo
*/
class Foo 
{

    public function doSomething($value="")
    {
        # code...
        $Bar = new Bar();
        $Bar->doSomething();
        echo "Foo doSomething","
" ; } } /** * Bar */ class Bar { public function doSomething($value="") { # code... $Bim = new Bim(); $Bim->doSomething(); echo "Bar doSomething","
" ; } } /** * Bim */ class Bim { public function doSomething($value="") { # code... echo "Bim doSomething","
" ; } } $doSomething = new Foo(); $doSomething->doSomething();

依赖注入

应用程序用到Foo类,Foo类需要Bar类,
Bar类需要Bim类,那么先创建Bim类,再创建Bar类并把Bim注入,再创建Foo类,并把Bar类注入,
再调用Foo方法,Foo调用Bar方法,接着做些其它工作。

/**
* Bim2
*/
class Bim2 
{
    
    public function doSomething($value="")
    {
        # code...
        echo "Bim2 doSomething","
" ; } } /** * Bar2 */ class Bar2 { private $bim2 ; public function __construct(Bim2 $bim2) { # code... $this->bim2 = $bim2 ; } public function doSomething($value="") { # code... $this->bim2->doSomething(); echo "Bar2 doSomething","
"; } } /** * Foo */ class Foo2 { private $bar2 ; public function __construct(Bar2 $bar2) { # code... $this->bar2 = $bar2 ; } public function doSomething($value="") { # code... $this->bar2->doSomething(); echo "Foo2 doSomething","
"; } } $doSomething2 = new Foo2(new Bar2(new Bim2())); $doSomething2->doSomething();

这就是控制反转模式。依赖关系的控制反转到调用链的起点。这样你可以完全控制依赖关系,通过调整不同的注入对象,来控制程序的行为。
例如Foo类用到了memcache,可以在不修改Foo类代码的情况下,改用redis。
使用依赖注入容器后的思路是应用程序需要到Foo类,就从容器内取得Foo类,容器创建Bim类,再创建Bar类并把Bim注入,再创建Foo类,并把Bar注入,应用程序调用Foo方法,Foo调用Bar方法,接着做些其它工作.

扩展:容器负责实例化,注入依赖,处理依赖关系等工作。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31001.html

相关文章

  • PHP+RabbitMQ实现消息队列(代码全篇)

    摘要:前言先安装对应的这里用的是不同的扩展实现方式会有细微的差异扩展地址具体以官网为准介绍配置信息基类生产者类消费者类消费者可有多个配置交换机路由生产者路由只控制发送成功不接受消费者是否收到频道 前言 先安装PHP对应的RabbitMQ,这里用的是 php_amqp 不同的扩展实现方式会有细微的差异. php扩展地址: http://pecl.php.net/package/amqp 具...

    weakish 评论0 收藏0
  • PHP:消息系统-消息事物模式(代码全篇)

    摘要:目录介绍消息事物类主业务类事物类消息事物类消息标签未发送确认发送发送成功已取消请求发送消息根据进行处理只记录消息数据不发送消息标记消息为返回消息唯一标识确认发送消息根据对消息进行处理发送消息数据标记消息为消息发送成功后标记消息为取消发送消息 目录介绍 MessageTr.php 消息事物类 Business.php 主业务类 BusinessDb.php DB事物类 Mess...

    dkzwm 评论0 收藏0
  • dedecms5.7(织梦)源码解析之程序安装补全篇

    摘要:前言之前写的织梦源码解析之程序安装一文中,还有几个值得讲解的文件没有提到,这里说明一下。总结安装文件,到此真的结束了。 前言 之前写的《dedecms5.7(织梦)源码解析之程序安装》一文中,还有几个值得讲解的文件没有提到,这里说明一下。 代码 templates目录 该文件夹中,一共有step-1.html、step-2.html、step-3.html、step-4.html、st...

    pkhope 评论0 收藏0
  • dedecms5.7(织梦)源码解析之程序安装补全篇

    摘要:前言之前写的织梦源码解析之程序安装一文中,还有几个值得讲解的文件没有提到,这里说明一下。总结安装文件,到此真的结束了。 前言 之前写的《dedecms5.7(织梦)源码解析之程序安装》一文中,还有几个值得讲解的文件没有提到,这里说明一下。 代码 templates目录 该文件夹中,一共有step-1.html、step-2.html、step-3.html、step-4.html、st...

    VioletJack 评论0 收藏0
  • PHP验证IOS原生支付是否成功(代码全篇)

    摘要:前言原生支付后需要调用服务端接口进行验证检测是否真正的支付成功环境配置建议提成配置参数错误操作成功支付验证苹果支付认证的凭证后的数据环境配置沙箱地址真实运营地址数据组装日志记录操作这两行一定要加,不加会报错误请求有错误数据错 前言 IOS原生支付后,需要调用服务端接口进行验证,检测是否真正的支付成功!

    fuyi501 评论0 收藏0

发表评论

0条评论

felix0913

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<