Completed
Push — master ( fb964a...b7229e )
by Jonathan
9s
created

Psr0FindFile   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 54
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
dl 0
loc 54
rs 10
c 0
b 0
f 0
ccs 20
cts 20
cp 1
wmc 8

2 Methods

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