[請益] Dependency Injection 疑問

看板PHP作者 (ChaN)時間10年前 (2015/06/09 18:35), 編輯推噓1(107)
留言8則, 4人參與, 最新討論串1/3 (看更多)
最近在看 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

06/09 19:14, , 1F
何不試試將animal改成車,然後你想換不同cc數的引擎…
06/09 19:14, 1F

06/09 19:16, , 2F
然後你再回頭想一想開放封閉原則…
06/09 19:16, 2F

06/09 20:59, , 3F
runtime才決定依賴關係就會需要DI 通常你需要有通用介面
06/09 20:59, 3F

06/09 21:01, , 4F
一般再透過語言reflection機制 依賴關係可以抽到設定檔
06/09 21:01, 4F

06/09 21:02, , 5F
程式要改實作不需要recompile 只要改設定檔就行
06/09 21:02, 5F

06/10 16:47, , 6F
個人覺得 animal 裡面為啥要有 fly ,又不是每隻都會飛
06/10 16:47, 6F

06/10 17:47, , 7F
其實可以啦!通通搭飛機就能fly了!
06/10 17:47, 7F

06/11 00:42, , 8F
Red bull給你一雙翅膀
06/11 00:42, 8F
文章代碼(AID): #1LTi63wL (PHP)
文章代碼(AID): #1LTi63wL (PHP)