资讯专栏INFORMATION COLUMN

PHP中的服务容器与依赖注入的解析(转载)

cjie / 1732人阅读

摘要:中的服务容器与依赖注入的解析原文目前比较流行的容器其他依赖注入容器依赖注入当类需要依赖于类,也就是说需要在类中实例化类的对象来使用时候,如果类中的功能发生改变,也会导致类中使用类的地方也要跟着修改,导致类与类高耦合。

PHP中的服务容器与依赖注入的解析--原文

目前比较流行的 PHP 容器:

Pimple
Laravel Container
其他依赖注入容器

依赖注入
当A类需要依赖于B类,也就是说需要在A类中实例化B类的对象来使用时候,如果B类中的功能发生改变,也会导致A类中使用B类的地方也要跟着修改,导致A类与B类高耦合。这个时候解决方式是,A类应该去依赖B类的接口,把具体的类的实例化交给外部。

就拿我们业务中常用的通知模块来说。

常规
messager = new Message();
    }

    public function seed_msg()
    {
        return $this->messager->seed();
    }
}

$Order = new Order();
echo $Order->seed_msg();

上面的代码是我们传统的写法。首先由个消息发送的类。然后在我们需要发送消息的地方,调用发送消息的接口。有一天你需要添加一个发送短信的接口以满足不同的需求。那么你会发现你要再Message类里面做修改。同样也要再Order类里面做修改。这样就显得很麻烦。这个时候就有了依赖注入的思路。

赖注入的思路
messager = $message;
    }

    public function seed_msg()
    {
        return $this->messager->seed();
    }

}

//我们需要发送邮件的时候
$message = new SeedEmail();
//将邮件发送对象作为参数传递给Order
$Order = new Order($message);
echo $Order->seed_msg();

echo "
";

//我们需要发送短信的时候
$message = new SeedSMS();
$Order = new Order($message);
echo $Order->seed_msg();

我理解的服务容器就是一个自动产生类的工厂。

服务容器
binds[$abstract] = $concrete;
        } else {
            $this->instances[$abstract] = $concrete;
        }
    }

    public function make($abstract, $parameters = [])
    {
        if (isset($this->instances[$abstract])) {
            return $this->instances[$abstract];
        }
        array_unshift($parameters, $this);
        return call_user_func_array($this->binds[$abstract], $parameters);
    }
}

//创建一个消息工厂
$message = new  Container();

//将发送短信注册绑定到工厂里面
$message->bind("SMS",function (){
     return   new  SeedSMS();
});

//将发送邮件注册绑定到工厂
$message->bind("EMAIL",function (){
   return new  SeedEmail();
});

//需要发送短信的时候
$SMS  = $message->make("SMS");
echo $SMS->seed();

echo "
";

$EMAIL  = $message->make("EMAIL");
echo $EMAIL->seed();

container是一个简单的服务容器里面有bind,make两个方法

bind是向容器中绑定服务对象。

make则是从容器中取出对象。

bind

在bind方法中需要传入一个 concrete 我们可以传入一个实例对象或者是一个闭包函数。
可以看到我这全使用的是闭包函数,其实也可以这样写

$sms = new  SeedSMS();
$message->bind("SMS",$sms);

后面这种写法与闭包相比的区别就是我们需要先实例化对象才能往容易中绑定服务。而闭包则是我们使用这个服务的时候才去实例化对象。可以看出闭包是有很多的优势的。

make

make方法就从容器中出去方法。里面首先判断了instances变量中是否有当前以及存在的服务对象,如果有直接返回。如果没有那么会通过 call_user_func_array返回一个对象。call_user_func_array的使用可以查看
PHP 中 call_user_func 的使用

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

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

相关文章

  • 又一个强大PHP5.3依赖注入容器

    摘要:现在我们就可以在构造函数或者任何其他通过服务容器注入依赖项的地方使用类型提示注入接口创建一个新的类实例,此处将注入的实例。自动解析构造函数所需的依赖的服务容器实现了接口。 简单的服务容器 一个简单的 php 5.3 依赖注入容器。 项目地址:https://github.com/godruoyi/easy-container Why 目前比较流行的 PHP 容器: Pimple La...

    sf190404 评论0 收藏0
  • Laravel深入学习2 - 控制反转容器

    摘要:控制反转容器控制反转使依赖注入变得更加便捷。有瑕疵控制反转容器是实现的控制翻转容器的一种替代方案。容器的独立使用即使没有使用框架,我们仍然可以在项目中使用安装组件来使用的控制反转容器。在没有给定任何信息的情况下,容器是无法实例化相关依赖的。 声明:本文并非博主原创,而是来自对《Laravel 4 From Apprentice to Artisan》阅读的翻译和理解,当然也不是原汁原味...

    worldligang 评论0 收藏0
  • 深入剖析 Laravel 服务容器

    摘要:划下重点,服务容器是用于管理类的依赖和执行依赖注入的工具。类的实例化及其依赖的注入,完全由服务容器自动的去完成。 本文首发于 深入剖析 Laravel 服务容器,转载请注明出处。喜欢的朋友不要吝啬你们的赞同,谢谢。 之前在 深度挖掘 Laravel 生命周期 一文中,我们有去探究 Laravel 究竟是如何接收 HTTP 请求,又是如何生成响应并最终呈现给用户的工作原理。 本章将带领大...

    abson 评论0 收藏0
  • Swoft 源码剖析 - Swoft 中 IOC 容器实现原理

    摘要:作者链接來源简书著作权归作者所有,本文已获得作者授权转载,并对原文进行了重新的排版。前言为应用提供一个完整的容器作为依赖管理方案,是功能,模块等功能的实现基础。的依赖注入管理方案基于服务定位器。源码剖析系列目录 作者:bromine链接:https://www.jianshu.com/p/a23...來源:简书著作权归作者所有,本文已获得作者授权转载,并对原文进行了重新的排版。Swof...

    Astrian 评论0 收藏0
  • Pimple - 一个简单 PHP 依赖注入容器

    摘要:服务通过匿名函数定义,返回一个对象的实例定义一些服务请注意,匿名函数可以访问当前容器实例,从而允许引用其他服务或参数。如果要为所有调用返回不同的实例,请使用方法包装你的匿名函数。 链接 官网 WebSite GitHub - Pimple 这是 Pimple 3.x 的文档。如果你正在使用 Pimple 1.x ,请查看 Pimple 1.x 文档。阅读 Pimple 1.x ...

    wemall 评论0 收藏0

发表评论

0条评论

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