依赖注入是控制反转的一种实现方式。要实现控制反转,需要将创建被调用者实例的工作交由 IOC 容器完成,然后在调用者中注入被调用者,通常使用构造器或方法注入实现。这样我们舅实现了调用者和被调用者的解偶,这个过程就是依赖注入。
那么控制反转是什么呢?其实也就是 A 依赖于 B,常规做法是在 A 中直接实例化 B,那么控制反转就是将 B 在外部实例化,然后传入 A 去使用。看完以后,其实对依赖注入也就有了理解。
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
| class Computer {
protected HardDisk $hardDisk;
public function __construct(HardDisk $disk) { $this->hardDisk = $disk; }
public function run() { $this->hardDisk->run(); echo '一台没有感情的电脑开始运行', PHP_EOL; } }
class HardDisk { public function run() { echo '一块没有感情的硬盘开始运行', PHP_EOL; } }
$disk = new HardDisk(); $computer = new Computer($disk); $computer->run();
|
以上代码就是一个简单的依赖注入,你以为这就结束了?并没有,咱们在学一下 IOC 容器:
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
| class Container {
public array $bindings = [];
public function bind($key, Closure $value) { $this->bindings[$key] = $value; }
public function make($key) { $new = $this->bindings[$key]; return $new(); }
}
$container = new Container();
$container->bind('disk', function (){ return new HardDisk(); }); $container->bind('computer', function () use($container){ return new Computer($container->make('disk')); });
$computer = $container->make('computer'); $computer->run();
|
ok,以上就是依赖注入的全部代码了。