PHP 依赖注入容器

2020-11-13_5fae3e971d521.png

介绍

使用 PHP 的反射类 ReflectionClass,创建容器方便管理依赖注入。

代码

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
<?php
interface GrowthInterface
{
public function evolve();
}

class Agumon implements GrowthInterface
{
public function evolve()
{
echo "亚古兽进化\n";
}
}

class Gabumon implements GrowthInterface
{
public function evolve()
{
echo "加布兽进化\n";
}
}

class DigitalBaby
{
public $growth;

public function __construct(GrowthInterface $growth)
{
$this->growth = $growth;
}
}

class DigitalWorld
{
protected $instances = [];
protected $bind = [];

public function set($digitalBabyName, $digitalBaby)
{
if (!class_exists($digitalBaby)) {
echo '我不知道数码宝贝是什么';
} else {
$this->bind[$digitalBabyName] = $digitalBaby;
}
}

public function get($digitalBabyName, $digitalBaby)
{
if (isset($this->instances[$digitalBabyName])) {
return $this->instances[$digitalBabyName];
}
if (!isset($this->bind[$digitalBabyName])) {
echo $digitalBabyName."这只数码宝贝貌似不存在";
}
$reflect = new ReflectionClass($this->bind[$digitalBabyName]);
return $this->instances[$digitalBabyName] = $reflect->newInstanceArgs($digitalBaby);
}
}

$digitalWorld = new DigitalWorld();
$digitalWorld->set('Agumon','DigitalBaby');
$digitalWorld->set('Gabumon','DigitalBaby');
echo $digitalWorld->get('Agumon',[new Agumon])->growth->evolve();
echo $digitalWorld->get('Gabumon',[new Gabumon])->growth->evolve();

创建 digitalBaby.php,代码如上。

执行

1
2
3
$ php digitalBaby.php
亚古兽进化
加布兽进化
-------------本文结束感谢您的阅读-------------
0%