作者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://www.ptt.cc/bbs/PHP/M.1433846147.A.E95.html
→ tkdmaf: 何不試試將animal改成車,然後你想換不同cc數的引擎… 06/09 19:14
→ tkdmaf: 然後你再回頭想一想開放封閉原則… 06/09 19:16
推 banjmin: runtime才決定依賴關係就會需要DI 通常你需要有通用介面 06/09 20:59
→ banjmin: 一般再透過語言reflection機制 依賴關係可以抽到設定檔 06/09 21:01
→ banjmin: 程式要改實作不需要recompile 只要改設定檔就行 06/09 21:02
→ gname: 個人覺得 animal 裡面為啥要有 fly ,又不是每隻都會飛 06/10 16:47
→ tkdmaf: 其實可以啦!通通搭飛機就能fly了! 06/10 17:47
→ alog: Red bull給你一雙翅膀 06/11 00:42