服务容器(自己总结)依赖注入
为了理解什么是服务容器,查了很多资料(给自己看的)。我看的每个资料都会讲解什么是依赖注入还有反转控制(IoC),刚开始真不好理解!!依赖注入其实就是需要的类实现类(比如实例)传给你要用到的类里面去,通常通过构造函数。目的是为了实现程序之间的解偶。可以看下下面的例子。
Visit.php文件
<?php
// 设计公共接口
interface Visit{
public function go();
}
// 实现不同交通工具类
class Leg implements Visit{
public function go()
{
echo 'walk to Tibet';
}
}
class Car implements Visit{
public function go()
{
echo 'drive car to Tibet !!!';
}
}
class Train implements Visit{
public function go()
{
echo 'go to Tibet by train!!!';
}
}
通常我们写业务代码的时候我们都会这么写。
Traveller.php文件
<?php
// 引入接口文件
include './Visit.php';
class Traveller {
protected $trafficTool;
public function __construct()
{
$this->trafficTool = new Leg();
}
public function visitTibet()
{
$this->trafficTool->go();
}
}
$tra = new Traveller();
$tra->visitTibet();
简单说下上面的代码表单什么意思。我有个接口叫参观(Visit),里面定一了一个走的方法(go)。下面有它的实现类。脚(leg),轿车(car),火车(train)。再定义一个旅游者类,他要去拉萨。
我通常写代码都会想上面Traveller类一样。其实上面的代码有个问题,就是耦合,这两个程序之间产生了依赖关系。这种情况在简单的程序里面体现不出什么。但如果需求变更。比方说:我不要走着去拉萨我要坐火车去。这个时候上面的代码则必须要修改。
依赖注入则不会。用依赖注入方式实现上面的代码。
Traveller.php文件
<?php
class Traveller
{
protected $trafficTool;
// 为啥前面的那个Visit 不加上的化就不行?
public function __construct(Visit $trafficTool)
{
$this->trafficTool = $trafficTool;
}
public function visitTibet()
{
$this->trafficTool->go();
}
}
说实话刚看到的时候觉得没有变化。就是把new一个类提到外面。其实变化还是蛮大的。这里它实现了解偶。就算要求改成其他交通工具car、train都不会影响到traveller这个类。都是在外部实new完在传进来。
本作品采用《CC 协议》,转载必须注明作者和本文链接