关于php中的DI依赖注入之详细解析

本文给大家带来了关于php的相关知识,带大家了解一下什么是 DI依赖注入,下面一起来看一下,希望对大家有所帮助。


关于php中的DI依赖注入之详细解析


关于php中的DI依赖注入之详细解析


ID依赖注入


依赖注入DI 其实本质上是指对类的依赖通过构造器完成自动注入。通俗来说,就是你当前操作一个类,但是这个类的某些方法或者功能不是单单只靠这个类就能完成的,而是要 借助另一个类 的才能完成的


其最直接的标志就是传参数据为对象的时候。严格来说,你想在一个类中操作另一个类,这两个类之间形成了相互依赖关系,传参的方式叫 注入


依赖注入出现的原因


●  在未使用依赖注入的时候,php 需要在一个类中使用另一个类的时候,往往都会进行如下操作


●  比如我在 container 类中需要用到 adapter 类,就需要在使用之前进行实例化


●  如果需要用到大量的外部类,这就会造成了 耦合度太高,很容易造成后期的 维护困难


●  通俗的来讲,也就是 container 脱离不了外部类去工作,这就叫 耦合度太高


<?php
class container
{
    private $adapter;
 
    public function __construct()
    {
        $this->adapter = new adapter();
    }
}


简单的依赖注入


●  上面的代码耦合度太高,导致了 依赖注入 的出现,主要是为了 解耦合


●  如下案例,我们只需要将所需要操作的类对象传入即可


●  依赖注入 操作的参数是 对象,而不是普通参数,是不是有更好的理解了


●  但是这样的简单依赖注入,会造成如果你依赖的类很多,你传参的时候会很长,容易混乱


<?php
class container
{
    private $adapter;
 
    public function __construct(adapter $adapter)
    {
        $this->adapter = $adapter;
    }
}


高阶的依赖注入


●  为了解决上面 参数混乱 的问题,这时候,依赖注入进行了优化


●  通过魔术方法,__get 去设置对象


●  这时候,我们就可以解决依赖太多,参数混乱的问题了


<?php
class container
{
    public $instance = [];
 
    public function __set($name, $value)
    {
        $this->instance[$name] = $value;
    }
}
 
$container = new container();
 
$container->adapter = new adapter();
$container->autofelix = new autofelix();


依赖注入的应用


●  我们先定义一个 容器类,主要用来向容器中 注入 你想要操作的类


●  使用的时候,只需要传容器这一个 对象 即可


<?php
class container
{
    public $instance = [];
 
    public function __set($name, $value)
    {
        $this->instance[$name] = $value;
    }
}
 
class adapter
{
    public $name = '我是调度器';
}
 
$container = new container();
$container->adapter = new adapter();
 
class autofelix
{
    private $container;
 
    public function __construct(container $container)
    {
        $this->container = $container;
    }
 
    public function who($class)
    {
        return $this->container->instance[$class]->name;
    }
}
 
$autofelix = new autofelix($container);
 
$who = $autofelix->who('adapter');
 
var_dump($who); //我是调度器


依赖注入高阶优化


●  在上面的应用中,我们 直接 将实例化后的对象注入容器中


●  这样会导致,所有的对象还没有被使用就会被实例化一遍,造成 资源的损耗


●  我们可以 传入闭包,这样对象就不会被实例化而注入,当你自己需要使用的时候,再去实例化,就可以减少 服务器资源的损耗 了


<?php
$container = new container();
$container->adapter = new adapter();
 
//高阶优化
$container = new container();
$container->adapter = function () {
    return new adapter();
};


以上就是关于php中的DI依赖注入之详细解析,翼速应用平台内有更多相关资讯,欢迎查阅!


我来说两句

0 条评论

推荐阅读

  • 响应式布局CSS媒体查询设备像素比介绍

    构建响应式网站布局最常见的是流体网格,灵活调整大小的站点布局技术,确保用户在使用的幕上获得完整的体验。响应式设计如何展示富媒体图像,可以通过以下几种方法。

    admin
  • 提升网站的性能快速加载的实用技巧

    网站速度很重要,快速加载的网站会带来更好的用户体验、更高的转化率、更多的参与度,而且在搜索引擎排名中也扮演重要角色,做SEO,网站硬件是起跑线,如果输在了起跑线,又怎么跟同行竞争。有许多方法可提升网站的性能,有一些技巧可以避免踩坑。

    admin
  • 织梦CMS TAG页找不到标签和实现彩色标签解决方法

    织梦cms是我们常见的网站程序系统的一款,在TAG标签中常常遇到的问题也很多。当我们点击 tags.php 页的某个标签的时候,有时会提示:“系统无此标签,可 能已经移除!” 但是我们检查程序后台,以及前台显示页面。这个标签确实存在,如果解决这个问题那?

    admin
  • HTML关于fieldset标签主要的作用

    在前端开发html页面中常用的标签很多,今天为大家带来的是关于HTML中fieldset标签主要的作用说明,根据技术分析HTML

    admin

精选专题