Passed
Push — master ( a6afd0...b1a13b )
by Oleg
05:01
created

Autoload::getClassPath()   B

Complexity

Conditions 4
Paths 4

Size

Total Lines 22
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 1 Features 0
Metric Value
c 3
b 1
f 0
dl 0
loc 22
rs 8.9197
cc 4
eloc 12
nc 4
nop 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 &copy; 2013 Oleg Lunegov
11
 * @license /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
    public static function setAlias($alias, $realPath)
35
    {
36
        self::$aliases[strtolower($alias)] = $realPath;
37
    }
38
39
    /**
40
     * Loader classes
41
     *
42
     * @access public
43
     *
44
     * @param string $className search class name
45
     *
46
     * @return bool
47
     * @static
48
     */
49
    public static function loader($className)
50
    {
51
        if ($path = self::getClassPath(ltrim($className, '\\'))) {
52
            /** @noinspection PhpIncludeInspection */
53
            require_once $path;
54
55
            return true;
56
        }
57
58
        return false;
59
    }
60
61
    /**
62
     * Get class path
63
     *
64
     * @access public
65
     *
66
     * @param string $className search class name
67
     * @param string $extension extension of class
68
     *
69
     * @return string
70
     * @static
71
     */
72
    public static function getClassPath($className, $extension = '.php')
73
    {
74
        $prefix = $className = self::camelCaseToLowerNamespace(str_replace('_', '\\', $className));
75
76
        while (false !== $position = strrpos($prefix, '\\')) {
77
            $prefix = substr($prefix, 0, $position);
78
            $alias = self::getAlias($prefix);
79
80
            if (!$alias) {
81
                continue;
82
            }
83
84
            $path = $alias.'\\'.substr($className, mb_strlen($prefix) + 1);
85
            $absolutePath = str_replace('\\', DIRECTORY_SEPARATOR, $path).$extension;
86
87
            if (is_readable($absolutePath)) {
88
                return $absolutePath;
89
            }
90
        }
91
92
        return false;
93
    }
94
95
    /**
96
     * Convert first symbols of namespace to lowercase
97
     *
98
     * @access protected
99
     *
100
     * @param string $path
101
     *
102
     * @return string
103
     * @static
104
     */
105
    private static function camelCaseToLowerNamespace($path)
106
    {
107
        $classNameArr = array_map(function($val) {
108
            return lcfirst($val);
109
        }, explode('\\', $path));
110
111
        $classNameArr[] = ucfirst(array_pop($classNameArr));
112
113
        return implode('\\', $classNameArr);
114
    }
115
116
    /**
117
     * Get alias
118
     *
119
     * @access public
120
     * @param string $alias
121
     * @return string|bool
122
     * @static
123
     */
124
    public static function getAlias($alias)
125
    {
126
        $alias = strtolower($alias);
127
128
        return array_key_exists($alias, self::$aliases) ? self::$aliases[$alias] : false;
129
    }
130
}
131