0%

laravel服务容器实践

很多时候发现光看并不能很好的学习新东西,必须要动手操作才有更深刻的理解。这篇文章边敲代码边学习laravel的核心功能


类的反射与依赖注入

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
84
85
86
87
88
89
90
91
92
93
94
95
96
<?php

class Tel
{
public $number;

public function __construct($number = 110)
{
$this->number = $number;
}
}

class Phone
{
const Time_ZONE = 'CN';

public $time;
public $tel;

public function __construct(Tel $tel)
{
$this->tel = $tel;
}

public function call(Tel $tel)
{
echo $tel->number . PHP_EOL;
}
}

$reflectionClass = new ReflectionClass(Phone::class);

var_dump($reflectionClass);
var_dump($reflectionClass->getConstructor());

$tel = new Tel(123);
//Creates a new class instance from given arguments.
var_dump($reflectionClass->newInstance($tel));

//反射类的一些方法,详细需要看手册理解,或者追踪该方法
var_dump($reflectionClass->getConstants());
var_dump($reflectionClass->getProperty('time'));
var_dump($reflectionClass->getProperties());
var_dump($reflectionClass->getFileName());
var_dump($reflectionClass->getMethods());


$parameters = $reflectionClass->getMethod('call')->getParameters();
foreach ($parameters as $parameter) {
var_dump($parameter->isDefaultValueAvailable()); // 是否是默认参数
var_dump($parameter->getClass()); //得到反射类对象
}
//依赖注入

function make(string $className)
{
$reflectionClass = new ReflectionClass($className);
$constructor = $reflectionClass->getConstructor(); // 获取构造方法
$parameters = $constructor->getParameters(); //获取方法中的参数
$dependencies = getDependencies($parameters);

return $reflectionClass->newInstanceArgs($dependencies);//最后实例化出所依赖的类,实现依赖注入
}

/**
* 获取依赖
* @param array $parameters 构造函数里的参数
* @return array
*/
function getDependencies(array $parameters): array
{
$dependencies = [];

foreach ($parameters as $parameter) {
$dependency = $parameter->getClass(); //获取构造函数中参数的对象

if (is_null($dependency)) { //如果没有则返回默认值或者设定值

if ($parameter->isDefaultValueAvailable()) {
$dependencies[] = $parameter->getDefaultValue(); //获取默认值
} else {
$dependencies[] = '0';
}

} else { //如果构造函数中的参数依赖某个类,则递归地实例化依赖类
$temp = make($dependency->name);
$dependencies[] = $temp;
}
}
return $dependencies;
}


$phone = make('Phone');
var_dump($phone);
//$tel = $phone->call();

服务容器

服务容器的两个概念,依赖注入和控制反转:

依赖注入和控制反转是对同一件事情的不同描述,它们描述的角度不同。依赖注入是从应用程序的角度在描述,应用程序依赖容器创建并注入它所需要的外部资源。而控制反转是从容器的角度在描述,容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。

服务提供者

//todo

最近多线学习,更新不完整,抱歉!