PHP依赖注入是什么?

技术2021-09-0452阅读

参考文献:http://blog.kaiot.xyz/read/60.html

把有依赖关系的类放进容器中,解析出这些类的实例,就是依赖注入,目的是实现类的解耦。

实例:Class A中用到了Class B的对象 bObject,普通情况下,需要在类A的代码中显示的new出一个B的对象。采用依赖注入后,A的代码只需要定义一个私有的B对象,不需要直接new 来获取这个对象,而是通过相关容器控制程序来将B的对象在外部new出来并注入到A类的引用中。

示例代码:

<?php
class A{
    protected $info;

    // $b 为实例化的b
    public function __construct($b){
        $this->info = $b;
    }

    public function a(){
        // 直接调用b中的方法
        return $this->info->b();
    }
}

class B{
    public function __construct(){
    }

    public function b(){
        return 'class b function b';
    }
}

$b = new B();
$a = new A($b);
$c = $a->a();
var_dump($c);

以上就是个简单的依赖注入,但有可能类B中b方法改名为c了,那类A中调用a方法时触发的b方法同样要修改为c,还是进入了上面的怪圈中,稍有变动就要改动很多有关联的内容。

接口类

接口类特点:

  • 接口的方法必须公开
  • 接口的方法默认是抽象的,故不需要在方法名前加abstract
  • 接口可以定义常量,但不能有成员属性,常量定义和用法和类中常量一样
  • 类可以实现多个接口
  • 接口也可继承接口

实例代码:

<?php
class A{
    protected $info;

    // $b 为实例化的b
    public function __construct($b){
        $this->info = $b;
    }

    public function a(){
        // 直接调用b中的方法
        return $this->info->b();
    }
}
// 接口类
interface B{
    // 抽象方法,没有具体逻辑
    public function b();
}

class C implements B{
    public function b(){
        return 'class c function B';
    }
}

class D implements B{
    public function b(){
        return 'class d function b';
    }
}

$c = new C();
$a = new A($c);
$c = $A->a();
var_dump($c);

在此代码中,实例化A时,不管传入C的实例或者D的实例都不影响类A中的a方法调用注入对象的b方法(此方法的方法名在抽象类中定义)

袁某人
心中无女人,代码自然神