Completed
Push — master ( 938a56...8c0811 )
by Jonathan
10s
created

Psr0FindFile::findFile()   C

Complexity

Conditions 7
Paths 16

Size

Total Lines 32
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 8.2464

Importance

Changes 0
Metric Value
cc 7
eloc 17
nc 16
nop 1
dl 0
loc 32
rs 6.7272
c 0
b 0
f 0
ccs 12
cts 17
cp 0.7059
crap 8.2464
1
<?php
2
namespace Doctrine\Common\Reflection;
3
4
use const DIRECTORY_SEPARATOR;
5
use function is_file;
6
use function str_replace;
7
use function strpos;
8
use function strrpos;
9
use function substr;
10
11
/**
12
 * Finds a class in a PSR-0 structure.
13
 */
14
class Psr0FindFile implements ClassFinderInterface
15
{
16
    /**
17
     * The PSR-0 prefixes.
18
     *
19
     * @var string[][]
20
     */
21
    protected $prefixes;
22
23
    /**
24
     * @param string[][] $prefixes An array of prefixes. Each key is a PHP namespace and each value is
25
     *                        a list of directories.
26
     */
27 14
    public function __construct($prefixes)
28
    {
29 14
        $this->prefixes = $prefixes;
30 14
    }
31
32
    /**
33
     * {@inheritDoc}
34
     */
35 14
    public function findFile($class)
36
    {
37 14
        $lastNsPos = strrpos($class, '\\');
38 14
        if ($class[0] === '\\') {
39
            $class = substr($class, 1);
40
        }
41
42 14
        if ($lastNsPos !== false) {
43
            // namespaced class name
44 14
            $classPath = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, 0, $lastNsPos)) . DIRECTORY_SEPARATOR;
45 14
            $className = substr($class, $lastNsPos + 1);
46
        } else {
47
            // PEAR-like class name
48
            $classPath = null;
49
            $className = $class;
50
        }
51
52 14
        $classPath .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
53
54 14
        foreach ($this->prefixes as $prefix => $dirs) {
55 14
            if (strpos($class, $prefix) !== 0) {
56
                continue;
57
            }
58
59 14
            foreach ($dirs as $dir) {
60 14
                if (is_file($dir . DIRECTORY_SEPARATOR . $classPath)) {
61 14
                    return $dir . DIRECTORY_SEPARATOR . $classPath;
62
                }
63
            }
64
        }
65
66
        return null;
67
    }
68
}
69