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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
<?php //依赖注入(Dependency Injection),简称DI。也可称为控制反转。 //感觉依赖注入有点像建造者模式,但是比建造者模式更灵活,所有的依赖都是注入进去的。 //假设有一个动物园,动物园有很多动物,大象、猴子、老虎、老鼠、兔子等等。 class Zoo{ private $tiger; public function __construct() { $this->tiger = new Tiger(); } } //如果按照上面的写法,则动物园必须要有老虎,没有就不能运营了。 //这样动物园对老虎,就产生了依赖关系。 class Zoo{ private $tiger; public function addTiger($tiger) { $this->tiger = $tiger; } } //这样写的话,其实动物园对老虎的依赖关系已经解除了。 //但是这样写又会存在一个问题,动物园中要添加一个动物就需要添加一个方法。 //addMonkey() addMouse() addRabbit() addElephant() ... //此时,就需要一个DI容器,来统一添加各种动物 class Zoo{ private $di; public function setDi($di) { $this->di = $di; } public function open() { echo '动物园开张了<br>'; $classList = $this->di->getDiList(); foreach ($classList as $key => $value) { $anmial = $this->di->get($key); $anmial->say(); } } } class Di{ private $classList; public function set($key, $class) { $this->classList[$key] = $class; } public function get($key) { return new $this->classList[$key]; } public function getDiList(){ return $this->classList; } } class Tiger{ public function say() { echo '我是老虎<br>'; } } class Elephant{ public function say() { echo '我是大象,我为php代言<br>'; } } class Mouse{ public function say() { echo '我是老鼠<br>'; } } $zoo = new Zoo(); $di = new Di(); $di->set('tiger', 'Tiger'); $di->set('elephant', 'Elephant'); $di->set('mouse', 'Mouse'); $zoo->setDi($di); $zoo->open(); |