ClassmapTrait   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 71
Duplicated Lines 0 %

Importance

Changes 2
Bugs 1 Features 1
Metric Value
eloc 16
c 2
b 1
f 1
dl 0
loc 71
rs 10
wmc 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A findSubClass() 0 9 3
A hasClass() 0 14 4
A storeClass() 0 3 1
A matchClass() 0 6 2
1
<?php
2
3
/**
4
 * Phoole (PHP7.2+)
5
 *
6
 * @category  Library
7
 * @package   Phoole\Di
8
 * @copyright Copyright (c) 2019 Hong Zhang
9
 */
10
declare(strict_types=1);
11
12
namespace Phoole\Di\Util;
13
14
/**
15
 * ClassmapTrait
16
 *
17
 * Store resolved/created objects in a classmap for later access or reference
18
 *
19
 * @package Phoole\Di
20
 */
21
trait ClassmapTrait
22
{
23
    /**
24
     * service objects stored by its classname
25
     *
26
     * @var object[]
27
     */
28
    protected $classMap = [];
29
30
    /**
31
     * has service created by its classname/interface name already?
32
     * returns the matching classname or NULL
33
     *
34
     * @param  string $className
35
     * @return string|NULL
36
     */
37
    protected function hasClass(string $className): ?string
38
    {
39
        // not a classname
40
        if (!\class_exists($className) && !\interface_exists($className)) {
41
            return NULL;
42
        }
43
44
        // exact match found
45
        if (isset($this->classMap[$className])) {
46
            return $className;
47
        }
48
49
        // find subclass
50
        return $this->findSubClass($className);
51
    }
52
53
    /**
54
     * Find in map a subclass of $className if any
55
     *
56
     * @param  string $className
57
     * @return string|null
58
     */
59
    protected function findSubClass(string $className): ?string
60
    {
61
        $classes = array_keys($this->classMap);
62
        foreach ($classes as $class) {
63
            if (is_a($class, $className, TRUE)) {
64
                return $class;
65
            }
66
        }
67
        return NULL;
68
    }
69
70
    /**
71
     * Retrieve object from classmap if match found
72
     *
73
     * @param  string $className
74
     * @return object|null
75
     */
76
    protected function matchClass(string $className): ?object
77
    {
78
        if ($class = $this->hasClass($className)) {
79
            return $this->classMap[$class];
80
        }
81
        return NULL;
82
    }
83
84
    /**
85
     * Store object in classmap
86
     *
87
     * @param  object $object
88
     */
89
    protected function storeClass(object $object): void
90
    {
91
        $this->classMap[get_class($object)] = $object;
92
    }
93
}