Dependency Injection,指的是让 Dependency 能在 runtime 改变,
而不影响 client 本身的实作。
而这个例子,Animal 跟 Bird 本身就没有依赖关系,没有
Dependency,自然没有 DI 的感觉。
若以电脑和影印机、萤幕来举例,电脑需要用输出装置才能输出讯息︰
class Computer
{
public $output;
public function use($something) {
$this->output = $something;
}
public function say_hi() {
$this->output("Hi I am computer!");
}
}
function printer($src_string) {
// print $src_string to printer...
}
function screen($src_string) {
// put $src_string on screen...
}
那么在使用时就可以很随易的使用不同装置︰
$computer = new Computer
$computer->use(printer);
$computer->say_hi();
$computer->use(screen);
$computer->say_hi();
今天突然改版,不用打印机也不用萤幕,改用沙画。
那你只要建立一个沙画的 service,要用时 inject 进 computer 就行了︰
function draw_on_sand($src_string) {
// draw string on sand...
}
$computer->use(draw_on_sand);
$computer->say_hi();
又或者你只是要 debug,想把电脑的输出印到自己的萤幕上︰
funcion print($src_string) {
echo $src_string;
}
$computer->use(print);
$computer->say_hi();
到这边应该看得出来,Dependency Injection 的好处就是,Client 完全
不用知道 $this->output 是什么玩意,只要把字串送给它就好。
引述前一篇 banjmin
> 关系被"接口"decoupling了
> 也就是"针对接口写程式,不要针对实作写程式"的OO守则