# 依赖注入
1。依赖:A做一件事时,必须要B帮忙,A依赖B。 比如手机充电, 需要找一个带电的插座吧。 没有带电插座就不行。
![](https://img.kancloud.cn/e8/8b/e88bc775706931eb4e4cbc1d9c597cec_500x500.png)
- - - - - -
2。当然我们用充电保也可以啊。那来看看程序吧。一个收货地址解释服务的事
```
<pre class="calibre7">```
<?php
//A 平台 收货地址解释类
class AAddressApi
{
public function explain($address)
{
return ['xxx省xx市', 'X三', 'xx手机号码'];
}
}
//程序有一个接口,代理复制客户的 商品信息跟收货地址,复制粘贴就可以,下单
class PlaceOrder
{
//分析字符串中的 商品信息,跟地址信息
public function explain($str)
{
//把字符串中的,商品信息,跟收货地址信息分离出来
[$product, $address] = $this->product2address($str);
//依赖 AAddressApi 这个类,这里写死了 AAddressApi,我必须要它,没有它我就不行
[$addr, $name, $phone] = (new AAddressApi())->explain($address);
var_dump("{$product}下单成功,发货到{$addr},{$name},{$phone}");
}
public function product2address($str) {
return ['华为手机Mate 80PRO', 'XXX省xx市x三,xx手机号码'];
}
}
$placeOrder = new PlaceOrder();
$placeOrder->explain('xxx');
```
3。然后有一天 AAddressApi 这个平台,老板转做包租公了,平台就没做了。 那个类 PlaceOrder 就会出错了。那怎么让 就算 A平台关闭了,PlaceOrder 也不出错呢 。就是不要把 依赖写死。
```
//A 平台收货地址解释类
class AAddressApi
{
public function explain($address)
{
return ['xxx省xx市', 'X三', 'xx手机号码'];
}
}
//百度平台 收货地址解释类
class BaiduAddressApi
{
public function explain($address) {
return ['xxx省xx市', 'X三', 'xx手机号码'];
}
}
class PlaceOrder
{
public $addressApi;
//依赖的类,从外面,传递进来
public function __construct($addressApi)
{
$this->addressApi = $addressApi;
}
//分析字符串中的 商品信息,跟地址信息
public function explain($str)
{
[$product, $address] = $this->product2address($str);
//不知道使用的是哪个对象。只要能解释地址就行
[$addr, $name, $phone] = $this->addressApi->explain($address);
var_dump("{$product}下单成功,发货到{$addr},{$name},{$phone}");
}
public function product2address($str) {
return ['华为手机Mate 80PRO', 'XXX省xx市x三,xx手机号码'];
}
}
//依赖的类,new 的时候,通过参数,传递进去
$placeOrder = new PlaceOrder(new AAddressApi());
$placeOrder->explain('xxx');
$placeOrder = new PlaceOrder(new BaiduAddressApi());
$placeOrder->explain('xxx');
```
4。这样 PlaceOrder 不需要修改就,也可以正常运行了。那问题来了,为什么要这样写呢把
```
//类如,下面这种写法
new PlaceOrder(new AAddressApi())
//A平台没用了,所有地方,不都得要修改。
new PlaceOrder(new BaiduAddressApi())
```
5。而且每次 new PlaceOrder() 还得写成 new PlaceOrder(new BaiduAddressApi()),更加麻烦。 下面以TP6框架为例,在”简单工厂“中介绍相关内容
- 1、面向对象编程
- 写的第一个接口
- 类、对象
- 面象对象之前-面向过程编程
- public、protected、private
- 魔法函数
- 接口
- 依赖注入
- 2、简单工厂
- 现实问题举例
- 现实问题解决办法
- 程序问题举例
- 程序解决办法
- 在THINKPHP6中的应用
- TP6中,把自己写的类放到工厂中去
- tp中app()函数自定义的没提示问题
- 3、外观模式
- 外观模式-现实问题举例
- 外观模式-现实问题解决办法
- 程序问题举例2
- 在THINKPHP6中的影子
- 外观模式--个人感想
- 4、适配器模式
- 现实问题举例3
- 实现场景
- 程序举例
- 5、单例模式
- 现实问题举例4
- 现实问题解决办法4
- 程序举例4
- 改进1
- THINKPHP6中的单例
- TP容器实现的“单例”
- 6、生成器模式
- 举例5
- php代码举例
- 代码分析
- php代码调整
- 再次改进,就是生成器模式了
- 对生成器模式的个人感想
- 7、原型模式
- 模式目地
- 实现举例
- 代码举例
- 浅克与深克
- 8、中介者模式
- 中介者-定义
- 中介者-结构
- 中介者-php代码举例
- 中介者-实际项目的一个例子
- 中介者-实际项目PHP
- 9、代理模式
- 代理模式-现实问题举例
- 代理模式-php代码
- 10、观察者模式
- 小时候煮饭的例子
- 观察者-编程中的问题
- 观察者-php代码举例
- 观察者-thinkphp6中的应用
- 11、命令模式
- 命令模式-定义
- 命令模式-php代码举例
- 命令模式-个人感觉
- 12、迭代器模式
- 迭代器-定义
- 虚构的分享微信美女故事
- 迭代器-php代码举例 - 不想完全公布的问题
- 迭代器-php代码举例 - 解决办法
- 13、组合模式
- 组合模式定义
- 组合模式-实际项目举例
- 组合模式-问题
- 组合模式-如果图片也有这个接口呢
- 真正的组合模式-例子
- 14、模板方法模式
- 模板方法-定义
- 模板方法-现实参考
- 模板方法-项目问题举例
- 模板方法-未用模式的代码
- 模板方法-使用模式的代码
- 15、策略模式
- 策略模式-定义
- 策略-虚构现实案例
- 策略-虚构现实案例PHP代码
- 策略-实际项目举例
- 策略-实际项目举例PHP代码-未使用模式
- 策略-实际项目举例PHP代码-使用模式
- 16、状态模式
- 状态模式定义
- 状态模式-实现案例
- 状态模式-未使用模式
- 状态模式-使用模式
- 17、备忘录模式
- 备忘录模式-定义
- 备忘录-形式图形
- 备忘录-比较真统的php代码
- 备忘录-实际项目想到的例子
- 备忘录-实际例子代码
- 18、享元模式
- 享元模式-定义
- 享元模式-看电影故事
- 享元模式-图形
- 享元模式-看电影PHP代码
- 享元模式-THINKPHP6中的应用
- 19、解释器模式
- 解释器-定义
- abc加减解释器例子
- 解释器-图解算法
- 解释器-三种类型对应的php代码
- 解释器-完整的代码
- 解释器-感觉
- 20、装饰模式
- 装饰模式-定义
- 装饰模式-快餐举例
- 装饰模式-php代码
- 装饰者模式-实际案例
- 21、责任链模式
- 责任链-定义
- 责任链-面试的例子
- 责任链-面试php代码
- 责任链-THINKPHP6中用应用
- 22、桥接模式
- 桥接模式-定义
- 桥接模式-案例举例
- 桥接模式-问题是怎么来的呢
- 桥接模式-使用模式后的代码
- 23、访问者模式
- 访问者-定义
- 访问者-结构关系
- 访问者-php代码举例