Passed
Branch master (221bfd)
by Wanderson
01:59
created

DI::instance()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 16
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 9
nc 3
nop 1
dl 0
loc 16
rs 9.9666
c 0
b 0
f 0
1
<?php
2
3
namespace Win\Common;
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
					$args[] = static::instance($param->getType()->getName());
37
				}
38
			}
39
			static::$instances[$class] = new $class(...$args);
40
		}
41
42
		return static::$instances[$class];
43
	}
44
}
45