PHP之DI依赖注入
php
design, php
字数统计: 533(字)
阅读时长: 2(分)
为了更好的理解 IOC (inversion of controller) 本文先理解一下什么是依赖注入 (dependency injection )
伪代码案例
什么是依赖?
从以下伪代码中,可以看到。PayBill 类中 payMyBill 方法的实现,需要先实例化 Alipay 类。所以这个时候依赖就产生了。
所以 ioc 的思想就是不要在 PayBill class 里面用 new 的方式去实例化解决依赖, 而且转为由外部来负责,简单一点就是内部没有 new 的这个步骤,通过依赖注入的方式同样的能获取到支付的实例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| <?php
class Alipay { public function __construct(){} public function pay() { echo 'pay bill by alipay'; } }
class Wechatpay { public function __construct(){} public function pay() { echo 'pay bill by wechatpay'; } }
class PayBill { private $payMethod; public function __construct() { $this->payMethod= new Alipay (); } public function payMyBill() { $this->payMethod->pay(); } }
$pb = new PayBill (); $pb->payMyBill();
|
什么是依赖注入?
跟之前的比较的话,我们加入一个 Pay 接口, 然后所有的支付方式都继承了这个接口并且实现了 pay 这个功能。
当我们实例化 PayBill class 的之前, 我们首先是实例化了一个 Alipay class,这个步骤就是生成了依赖了,然后我们需要把这个依赖注入到 PayBill class 的实例当中。
把 Alipay class 的实例通过 construct 注入的方式去实例化一个 PayBill class 在这里我们的注入是手动注入,不是自动的。而 Laravel 框架实现则是自动注入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| <?php
interface Pay { public function pay(); }
class Alipay implements Pay { public function __construct(){} public function pay() { echo 'pay bill by alipay'; } }
class Wechatpay implements Pay { public function __construct(){} public function pay() { echo 'pay bill by wechatpay'; } }
class PayBill { private $payMethod; public function __construct(Pay $payMethod) { $this->payMethod= $payMethod; } public function payMyBill() { $this->payMethod->pay(); } }
$payMethod = new Alipay();
$pb = new PayBill( $payMethod ); $pb->payMyBill();
|