-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathContainer.php
61 lines (52 loc) · 1.49 KB
/
Container.php
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
<?php
/**
* Simple DI
*
* Very simple Dependency Injector/Service Container.
* For learning purpose.
*
* @author Gemblue
*/
class Container {
/**
* Resolve class, instantiate automate by reflection.
*
* @return object
*/
public function resolve(string $className)
{
// Create a reflection.
$reflector = new ReflectionClass($className);
// Get it's constructor.
$constructor = $reflector->getConstructor();
// Search dependency and resolve. By constructor parameters.
$args = $this->getDependencies($constructor->getParameters());
return $reflector->newInstanceArgs($args);
}
/**
* Find the dependencies, if class then resolve.
* Run resolve recursively.
*
* @return array
*/
public function getDependencies($parameters)
{
$args = [];
foreach ($parameters as $parameter)
{
// Get class from param.
$isClass = $parameter->getClass();
// Is param a class?
if ($isClass) {
// Yes, resolve param class, create instance, call resolve.
$type = $parameter->name;
// Assign to args, resolve.
$args[] = $this->resolve($type); // Recursively.
} else {
// Just assign default value.
$args[] = $parameter->getDefaultValue();
}
}
return $args;
}
}