Completed
Push — master ( 2beda2...a430e0 )
by Oleg
03:55
created

Autoload   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 116
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 0

Test Coverage

Coverage 25.81%

Importance

Changes 6
Bugs 2 Features 0
Metric Value
wmc 12
c 6
b 2
f 0
lcom 1
cbo 0
dl 0
loc 116
ccs 8
cts 31
cp 0.2581
rs 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A setAlias() 0 6 3
A loader() 0 11 2
B getClassPath() 0 22 4
A camelCaseToLowerNamespace() 0 10 1
A getAlias() 0 6 2
1
<?php /** MicroAutoload */
2
3
namespace Micro\Base;
4
5
/**
6
 * Autoload class file.
7
 *
8
 * @author Oleg Lunegov <[email protected]>
9
 * @link https://github.com/linpax/microphp-framework
10
 * @copyright Copyright (c) 2013 Oleg Lunegov
11
 * @license https://github.com/linpax/microphp-framework/blob/master/LICENSE
12
 * @package Micro
13
 * @subpackage Base
14
 * @version 1.0
15
 * @since 1.0
16
 */
17
class Autoload
18
{
19
    /** @var array $aliases Autoload aliases maps */
20
    private static $aliases = [];
21
22
23
    /**
24
     * Setting or installing new alias
25
     *
26
     * @access public
27
     *
28
     * @param string $alias name for new alias
29
     * @param string $realPath path of alias
30
     *
31
     * @return void
32
     * @static
33
     */
34 1
    public static function setAlias($alias, $realPath)
35
    {
36 1
        if (is_string($alias) && is_string($realPath)) {
37 1
            self::$aliases[strtolower($alias)] = $realPath;
38 1
        }
39 1
    }
40
41
    /**
42
     * Loader classes
43
     *
44
     * @access public
45
     *
46
     * @param string $className search class name
47
     *
48
     * @return bool
49
     * @static
50
     */
51
    public static function loader($className)
52
    {
53
        if ($path = self::getClassPath(ltrim($className, '\\'))) {
54
            /** @noinspection PhpIncludeInspection */
55
            require_once $path;
56
57
            return true;
58
        }
59
60
        return false;
61
    }
62
63
    /**
64
     * Get class path
65
     *
66
     * @access public
67
     *
68
     * @param string $className search class name
69
     * @param string $extension extension of class
70
     *
71
     * @return string
72
     * @static
73
     */
74
    public static function getClassPath($className, $extension = '.php')
75
    {
76
        $prefix = $className = self::camelCaseToLowerNamespace(str_replace('_', '\\', $className));
77
78
        while (false !== $position = strrpos($prefix, '\\')) {
79
            $prefix = substr($prefix, 0, $position);
80
            $alias = self::getAlias($prefix);
81
82
            if (!$alias) {
83
                continue;
84
            }
85
86
            $path = $alias.'\\'.substr($className, mb_strlen($prefix) + 1);
87
            $absolutePath = str_replace('\\', DIRECTORY_SEPARATOR, $path).$extension;
88
89
            if (is_readable($absolutePath)) {
90
                return $absolutePath;
91
            }
92
        }
93
94
        return false;
95
    }
96
97
    /**
98
     * Convert first symbols of namespace to lowercase
99
     *
100
     * @access protected
101
     *
102
     * @param string $path
103
     *
104
     * @return string
105
     * @static
106
     */
107
    private static function camelCaseToLowerNamespace($path)
108
    {
109
        $classNameArr = array_map(function($val) {
110
            return lcfirst($val);
111
        }, explode('\\', $path));
112
113
        $classNameArr[] = ucfirst(array_pop($classNameArr));
114
115
        return implode('\\', $classNameArr);
116
    }
117
118
    /**
119
     * Get alias
120
     *
121
     * @access public
122
     * @param string $alias
123
     * @return string|bool
124
     * @static
125
     */
126 2
    public static function getAlias($alias)
127
    {
128 2
        $alias = strtolower($alias);
129
130 2
        return array_key_exists($alias, self::$aliases) ? self::$aliases[$alias] : false;
131
    }
132
}
133