作者chan15 (ChaN)
看板PHP
标题[请益]Dependency Injection 疑问
时间Tue Jun 9 18:35:45 2015
最近在看 PHP solid 原则,看到 Dependency Injection 有点卡住
我不太懂他的使用时机,一般的 sample code 大多是类似
<?php
class Animal
{
public $animal;
public function __construct(AnimalInterface $animal)
{
$this->animal = $animal;
}
public function fly()
{
$this->animal->fly();
}
}
class Bird implements AnimalInterface
{
public function fly()
{
echo 'flying...';
}
}
$animal = new Animal(new Bird);
$animal->fly();
我不是很懂这样抽换的用意是什麽,因为单纯要限制 function 的话 interface 那层就可以了
你在不同的地方呼叫
$animal = new Bird;
$animal->fly();
效果是一样的,更何况 Bird 还不能使用 Animal 的功能,除非他 assign
最全面跟弹性的内容应该是
<?php
abstract class Animal
{
public function miles()
{
return rand(1000, 9999);
}
abstract function fly();
}
class Bird extends Animal
{
public function fly()
{
$miles = parent::miles();
echo "{$miles} miles to flying...";
}
}
(new Bird)->fly();
可以告诉小弟 DI 的使用时机吗
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.219.144.228
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/PHP/M.1433846147.A.E95.html
1F:→ tkdmaf: 何不试试将animal改成车,然後你想换不同cc数的引擎… 06/09 19:14
2F:→ tkdmaf: 然後你再回头想一想开放封闭原则… 06/09 19:16
3F:推 banjmin: runtime才决定依赖关系就会需要DI 通常你需要有通用介面 06/09 20:59
4F:→ banjmin: 一般再透过语言reflection机制 依赖关系可以抽到设定档 06/09 21:01
5F:→ banjmin: 程式要改实作不需要recompile 只要改设定档就行 06/09 21:02
6F:→ gname: 个人觉得 animal 里面为啥要有 fly ,又不是每只都会飞 06/10 16:47
7F:→ tkdmaf: 其实可以啦!通通搭飞机就能fly了! 06/10 17:47
8F:→ alog: Red bull给你一双翅膀 06/11 00:42