Passed
Pull Request — master (#26)
by Wanderson
02:55
created

DI::instance()   A

Complexity

Conditions 5
Paths 3

Size

Total Lines 18
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 10
nc 3
nop 1
dl 0
loc 18
rs 9.6111
c 0
b 0
f 0
1
<?php
2
3
namespace Win;
4
5
use ReflectionClass;
6
7
/**
8
 * Dependence Injector
9
 * 
10
 * Se há um apelido para a classe dentro de $container,
11
 * então ela será utilizada ao invés da classe original.
12
 */
13
abstract class DI
14
{
15
	/**
16
	 * Armazena os nomes de classes
17
	 * @var string[]
18
	 */
19
	public static $container = [];
20
	public static $instances = [];
21
22
	/**
23
	 * Cria a classe, injetando as dependências
24
	 * @param string $class
25
	 * @return object
26
	 */
27
	public static function instance(string $class)
28
	{
29
		$class = static::$container[$class] ?? $class;
30
31
		if (!key_exists($class, static::$instances)) {
32
			$args = [];
33
			$con = (new ReflectionClass($class))->getConstructor();
34
			if (!is_null($con)) {
35
				foreach ($con->getParameters() as $param) {
36
					if ($param->getType()) {
37
						$args[] = static::instance($param->getType()->getName());
38
					}
39
				}
40
			}
41
			static::$instances[$class] = new $class(...$args);
42
		}
43
44
		return static::$instances[$class];
45
	}
46
}
47