These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | |||
3 | namespace Robo\ClassDiscovery; |
||
4 | |||
5 | use Symfony\Component\Finder\Finder; |
||
6 | use Composer\Autoload\ClassLoader; |
||
7 | |||
8 | /** |
||
9 | * Class RelativeNamespaceDiscovery |
||
10 | * |
||
11 | * @package Robo\Plugin\ClassDiscovery |
||
12 | */ |
||
13 | class RelativeNamespaceDiscovery extends AbstractClassDiscovery |
||
14 | { |
||
15 | /** |
||
16 | * @var \Composer\Autoload\ClassLoader |
||
17 | */ |
||
18 | protected $classLoader; |
||
19 | |||
20 | /** |
||
21 | * @var string |
||
22 | */ |
||
23 | protected $relativeNamespace = ''; |
||
24 | |||
25 | /** |
||
26 | * RelativeNamespaceDiscovery constructor. |
||
27 | * |
||
28 | * @param \Composer\Autoload\ClassLoader $classLoader |
||
29 | */ |
||
30 | public function __construct(ClassLoader $classLoader) |
||
31 | { |
||
32 | $this->classLoader = $classLoader; |
||
33 | } |
||
34 | |||
35 | /** |
||
36 | * @param string $relativeNamespace |
||
37 | * |
||
38 | * @return RelativeNamespaceDiscovery |
||
39 | */ |
||
40 | public function setRelativeNamespace($relativeNamespace) |
||
41 | { |
||
42 | $this->relativeNamespace = $relativeNamespace; |
||
43 | |||
44 | return $this; |
||
45 | } |
||
46 | |||
47 | /** |
||
48 | * @inheritDoc |
||
49 | */ |
||
50 | public function getClasses() |
||
51 | { |
||
52 | $classes = []; |
||
53 | $relativePath = $this->convertNamespaceToPath($this->relativeNamespace); |
||
54 | |||
55 | foreach ($this->classLoader->getPrefixesPsr4() as $baseNamespace => $directories) { |
||
56 | $directories = array_filter(array_map(function ($directory) use ($relativePath) { |
||
57 | return $directory.$relativePath; |
||
58 | }, $directories), 'is_dir'); |
||
59 | |||
60 | if ($directories) { |
||
0 ignored issues
–
show
|
|||
61 | foreach ($this->search($directories, $this->searchPattern) as $file) { |
||
62 | $relativePathName = $file->getRelativePathname(); |
||
63 | $classes[] = $baseNamespace.$this->convertPathToNamespace($relativePath.'/'.$relativePathName); |
||
64 | } |
||
65 | } |
||
66 | } |
||
67 | |||
68 | return $classes; |
||
69 | } |
||
70 | |||
71 | /** |
||
72 | * {@inheritdoc} |
||
73 | */ |
||
74 | public function getFile($class) |
||
75 | { |
||
76 | return $this->classLoader->findFile($class); |
||
77 | } |
||
78 | |||
79 | /** |
||
80 | * @param $directories |
||
81 | * @param $pattern |
||
82 | * |
||
83 | * @return \Symfony\Component\Finder\Finder |
||
84 | */ |
||
85 | protected function search($directories, $pattern) |
||
86 | { |
||
87 | $finder = new Finder(); |
||
88 | $finder->files() |
||
89 | ->name($pattern) |
||
90 | ->in($directories); |
||
91 | |||
92 | return $finder; |
||
93 | } |
||
94 | |||
95 | /** |
||
96 | * @param $path |
||
97 | * |
||
98 | * @return mixed |
||
99 | */ |
||
100 | protected function convertPathToNamespace($path) |
||
101 | { |
||
102 | return str_replace(['/', '.php'], ['\\', ''], trim($path, '/')); |
||
103 | } |
||
104 | |||
105 | /** |
||
106 | * @return string |
||
107 | */ |
||
108 | public function convertNamespaceToPath($namespace) |
||
109 | { |
||
110 | return '/'.str_replace("\\", '/', trim($namespace, '\\')); |
||
111 | } |
||
112 | } |
||
113 |
This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.
Consider making the comparison explicit by using
empty(..)
or! empty(...)
instead.