Passed
Pull Request — master (#27)
by Wanderson
01:58
created

DI   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 33
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 13
c 1
b 0
f 0
dl 0
loc 33
rs 10
wmc 5

1 Method

Rating   Name   Duplication   Size   Complexity  
A instance() 0 19 5
1
<?php
2
3
namespace Win;
4
5
use ReflectionClass;
6
use ReflectionParameter;
7
8
/**
9
 * Dependence Injector
10
 * 
11
 * Se há um apelido para a classe dentro de $container,
12
 * então ela será utilizada ao invés da classe original.
13
 */
14
abstract class DI
15
{
16
	/**
17
	 * Armazena os nomes de classes
18
	 * @var string[]
19
	 */
20
	public static $container = [];
21
	public static $instances = [];
22
23
	/**
24
	 * Cria a classe, injetando as dependências
25
	 * @param string $class
26
	 * @return object
27
	 */
28
	public static function instance(string $class)
29
	{
30
		$class = static::$container[$class] ?? $class;
31
32
		if (!key_exists($class, static::$instances)) {
33
			$args = [];
34
			$con = (new ReflectionClass($class))->getConstructor();
35
			/** @var ReflectionParameter[] $params */
36
			$params = $con ? $con->getParameters() : [];
1 ignored issue
show
introduced by
$con is of type ReflectionMethod, thus it always evaluated to true.
Loading history...
37
38
			foreach ($params as $param) {
39
				if ($param->getType()) {
40
					$args[] = static::instance($param->getType()->getName());
41
				}
42
			}
43
			static::$instances[$class] = new $class(...$args);
44
		}
45
46
		return static::$instances[$class];
47
	}
48
}
49