Passed
Branch master (501f65)
by Wanderson
02:54 queued 54s
created

DI::instance()   A

Complexity

Conditions 5
Paths 3

Size

Total Lines 19
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 10
nc 3
nop 1
dl 0
loc 19
rs 9.6111
c 0
b 0
f 0
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