PluginProbe
UsersWP – Front-end login form, User Registration, User Profile & Members Directory plugin for WP / 1.2.74
UsersWP – Front-end login form, User Registration, User Profile & Members Directory plugin for WP v1.2.74
1.2.74 1.2.73 1.2.72 1.2.71 1.2.70 1.2.69 1.2.68 1.2.67 1.2.66 1.2.65 1.2.64 1.2.63 trunk 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.19 1.0.20 1.0.21 All 174 releases
← All changes | vendor/composer/ClassLoader.php +169 -35 1.0.211.2.74 View file →
@@ -36,52 +36,119 @@
36 36 * This class is loosely based on the Symfony UniversalClassLoader.
37 37 *
38 38 * @author Fabien Potencier <fabien@symfony.com>
39 39 * @author Jordi Boggiano <j.boggiano@seld.be>
40 - * @see http://www.php-fig.org/psr/psr-0/
41 - * @see http://www.php-fig.org/psr/psr-4/
40 + * @see https://www.php-fig.org/psr/psr-0/
41 + * @see https://www.php-fig.org/psr/psr-4/
42 42 */
43 43 class ClassLoader
44 44 {
45 + /** @var \Closure(string):void */
46 + private static $includeFile;
47 +
48 + /** @var string|null */
49 + private $vendorDir;
50 +
45 51 // PSR-4
52 + /**
53 + * @var array<string, array<string, int>>
54 + */
46 55 private $prefixLengthsPsr4 = array();
56 + /**
57 + * @var array<string, list<string>>
58 + */
47 59 private $prefixDirsPsr4 = array();
60 + /**
61 + * @var list<string>
62 + */
48 63 private $fallbackDirsPsr4 = array();
49 64
50 65 // PSR-0
66 + /**
67 + * List of PSR-0 prefixes
68 + *
69 + * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
70 + *
71 + * @var array<string, array<string, list<string>>>
72 + */
51 73 private $prefixesPsr0 = array();
74 + /**
75 + * @var list<string>
76 + */
52 77 private $fallbackDirsPsr0 = array();
53 78
79 + /** @var bool */
54 80 private $useIncludePath = false;
81 +
82 + /**
83 + * @var array<string, string>
84 + */
55 85 private $classMap = array();
86 +
87 + /** @var bool */
56 88 private $classMapAuthoritative = false;
89 +
90 + /**
91 + * @var array<string, bool>
92 + */
57 93 private $missingClasses = array();
94 +
95 + /** @var string|null */
58 96 private $apcuPrefix;
59 97
98 + /**
99 + * @var array<string, self>
100 + */
101 + private static $registeredLoaders = array();
102 +
103 + /**
104 + * @param string|null $vendorDir
105 + */
106 + public function __construct($vendorDir = null)
107 + {
108 + $this->vendorDir = $vendorDir;
109 + self::initializeIncludeClosure();
110 + }
111 +
112 + /**
113 + * @return array<string, list<string>>
114 + */
60 115 public function getPrefixes()
61 116 {
62 117 if (!empty($this->prefixesPsr0)) {
63 - return call_user_func_array('array_merge', $this->prefixesPsr0);
118 + return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
64 119 }
65 120
66 121 return array();
67 122 }
68 123
124 + /**
125 + * @return array<string, list<string>>
126 + */
69 127 public function getPrefixesPsr4()
70 128 {
71 129 return $this->prefixDirsPsr4;
72 130 }
73 131
132 + /**
133 + * @return list<string>
134 + */
74 135 public function getFallbackDirs()
75 136 {
76 137 return $this->fallbackDirsPsr0;
77 138 }
78 139
140 + /**
141 + * @return list<string>
142 + */
79 143 public function getFallbackDirsPsr4()
80 144 {
81 145 return $this->fallbackDirsPsr4;
82 146 }
83 147
148 + /**
149 + * @return array<string, string> Array of classname => path
150 + */
84 151 public function getClassMap()
85 152 {
86 153 return $this->classMap;
87 154 }
@@ -86,9 +153,11 @@
86 153 return $this->classMap;
87 154 }
88 155
89 156 /**
90 - * @param array $classMap Class to filename map
157 + * @param array<string, string> $classMap Class to filename map
158 + *
159 + * @return void
91 160 */
92 161 public function addClassMap(array $classMap)
93 162 {
94 163 if ($this->classMap) {
@@ -101,24 +170,27 @@
101 170 /**
102 171 * Registers a set of PSR-0 directories for a given prefix, either
103 172 * appending or prepending to the ones previously set for this prefix.
104 173 *
105 - * @param string $prefix The prefix
106 - * @param array|string $paths The PSR-0 root directories
107 - * @param bool $prepend Whether to prepend the directories
174 + * @param string $prefix The prefix
175 + * @param list<string>|string $paths The PSR-0 root directories
176 + * @param bool $prepend Whether to prepend the directories
177 + *
178 + * @return void
108 179 */
109 180 public function add($prefix, $paths, $prepend = false)
110 181 {
182 + $paths = (array) $paths;
111 183 if (!$prefix) {
112 184 if ($prepend) {
113 185 $this->fallbackDirsPsr0 = array_merge(
114 - (array) $paths,
186 + $paths,
115 187 $this->fallbackDirsPsr0
116 188 );
117 189 } else {
118 190 $this->fallbackDirsPsr0 = array_merge(
119 191 $this->fallbackDirsPsr0,
120 - (array) $paths
192 + $paths
121 193 );
122 194 }
123 195
124 196 return;
@@ -125,21 +197,21 @@
125 197 }
126 198
127 199 $first = $prefix[0];
128 200 if (!isset($this->prefixesPsr0[$first][$prefix])) {
129 - $this->prefixesPsr0[$first][$prefix] = (array) $paths;
201 + $this->prefixesPsr0[$first][$prefix] = $paths;
130 202
131 203 return;
132 204 }
133 205 if ($prepend) {
134 206 $this->prefixesPsr0[$first][$prefix] = array_merge(
135 - (array) $paths,
207 + $paths,
136 208 $this->prefixesPsr0[$first][$prefix]
137 209 );
138 210 } else {
139 211 $this->prefixesPsr0[$first][$prefix] = array_merge(
140 212 $this->prefixesPsr0[$first][$prefix],
141 - (array) $paths
213 + $paths
142 214 );
143 215 }
144 216 }
145 217
@@ -146,27 +218,30 @@
146 218 /**
147 219 * Registers a set of PSR-4 directories for a given namespace, either
148 220 * appending or prepending to the ones previously set for this namespace.
149 221 *
150 - * @param string $prefix The prefix/namespace, with trailing '\\'
151 - * @param array|string $paths The PSR-4 base directories
152 - * @param bool $prepend Whether to prepend the directories
222 + * @param string $prefix The prefix/namespace, with trailing '\\'
223 + * @param list<string>|string $paths The PSR-4 base directories
224 + * @param bool $prepend Whether to prepend the directories
153 225 *
154 226 * @throws \InvalidArgumentException
227 + *
228 + * @return void
155 229 */
156 230 public function addPsr4($prefix, $paths, $prepend = false)
157 231 {
232 + $paths = (array) $paths;
158 233 if (!$prefix) {
159 234 // Register directories for the root namespace.
160 235 if ($prepend) {
161 236 $this->fallbackDirsPsr4 = array_merge(
162 - (array) $paths,
237 + $paths,
163 238 $this->fallbackDirsPsr4
164 239 );
165 240 } else {
166 241 $this->fallbackDirsPsr4 = array_merge(
167 242 $this->fallbackDirsPsr4,
168 - (array) $paths
243 + $paths
169 244 );
170 245 }
171 246 } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
172 247 // Register directories for a new namespace.
@@ -174,13 +249,13 @@
174 249 if ('\\' !== $prefix[$length - 1]) {
175 250 throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
176 251 }
177 252 $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
178 - $this->prefixDirsPsr4[$prefix] = (array) $paths;
253 + $this->prefixDirsPsr4[$prefix] = $paths;
179 254 } elseif ($prepend) {
180 255 // Prepend directories for an already registered namespace.
181 256 $this->prefixDirsPsr4[$prefix] = array_merge(
182 - (array) $paths,
257 + $paths,
183 258 $this->prefixDirsPsr4[$prefix]
184 259 );
185 260 } else {
186 261 // Append directories for an already registered namespace.
@@ -185,9 +260,9 @@
185 260 } else {
186 261 // Append directories for an already registered namespace.
187 262 $this->prefixDirsPsr4[$prefix] = array_merge(
188 263 $this->prefixDirsPsr4[$prefix],
189 - (array) $paths
264 + $paths
190 265 );
191 266 }
192 267 }
193 268
@@ -194,10 +269,12 @@
194 269 /**
195 270 * Registers a set of PSR-0 directories for a given prefix,
196 271 * replacing any others previously set for this prefix.
197 272 *
198 - * @param string $prefix The prefix
199 - * @param array|string $paths The PSR-0 base directories
273 + * @param string $prefix The prefix
274 + * @param list<string>|string $paths The PSR-0 base directories
275 + *
276 + * @return void
200 277 */
201 278 public function set($prefix, $paths)
202 279 {
203 280 if (!$prefix) {
@@ -210,12 +287,14 @@
210 287 /**
211 288 * Registers a set of PSR-4 directories for a given namespace,
212 289 * replacing any others previously set for this namespace.
213 290 *
214 - * @param string $prefix The prefix/namespace, with trailing '\\'
215 - * @param array|string $paths The PSR-4 base directories
291 + * @param string $prefix The prefix/namespace, with trailing '\\'
292 + * @param list<string>|string $paths The PSR-4 base directories
216 293 *
217 294 * @throws \InvalidArgumentException
295 + *
296 + * @return void
218 297 */
219 298 public function setPsr4($prefix, $paths)
220 299 {
221 300 if (!$prefix) {
@@ -233,8 +312,10 @@
233 312 /**
234 313 * Turns on searching the include path for class files.
235 314 *
236 315 * @param bool $useIncludePath
316 + *
317 + * @return void
237 318 */
238 319 public function setUseIncludePath($useIncludePath)
239 320 {
240 321 $this->useIncludePath = $useIncludePath;
@@ -255,8 +336,10 @@
255 336 * Turns off searching the prefix and fallback directories for classes
256 337 * that have not been registered with the class map.
257 338 *
258 339 * @param bool $classMapAuthoritative
340 + *
341 + * @return void
259 342 */
260 343 public function setClassMapAuthoritative($classMapAuthoritative)
261 344 {
262 345 $this->classMapAuthoritative = $classMapAuthoritative;
@@ -275,8 +358,10 @@
275 358 /**
276 359 * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
277 360 *
278 361 * @param string|null $apcuPrefix
362 + *
363 + * @return void
279 364 */
280 365 public function setApcuPrefix($apcuPrefix)
281 366 {
282 367 $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
@@ -295,20 +380,39 @@
295 380 /**
296 381 * Registers this instance as an autoloader.
297 382 *
298 383 * @param bool $prepend Whether to prepend the autoloader or not
384 + *
385 + * @return void
299 386 */
300 387 public function register($prepend = false)
301 388 {
302 389 spl_autoload_register(array($this, 'loadClass'), true, $prepend);
390 +
391 + if (null === $this->vendorDir) {
392 + return;
393 + }
394 +
395 + if ($prepend) {
396 + self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
397 + } else {
398 + unset(self::$registeredLoaders[$this->vendorDir]);
399 + self::$registeredLoaders[$this->vendorDir] = $this;
400 + }
303 401 }
304 402
305 403 /**
306 404 * Unregisters this instance as an autoloader.
405 + *
406 + * @return void
307 407 */
308 408 public function unregister()
309 409 {
310 410 spl_autoload_unregister(array($this, 'loadClass'));
411 +
412 + if (null !== $this->vendorDir) {
413 + unset(self::$registeredLoaders[$this->vendorDir]);
414 + }
311 415 }
312 416
313 417 /**
314 418 * Loads the given class or interface.
@@ -313,17 +417,20 @@
313 417 /**
314 418 * Loads the given class or interface.
315 419 *
316 420 * @param string $class The name of the class
317 - * @return bool|null True if loaded, null otherwise
421 + * @return true|null True if loaded, null otherwise
318 422 */
319 423 public function loadClass($class)
320 424 {
321 425 if ($file = $this->findFile($class)) {
322 - includeFile($file);
426 + $includeFile = self::$includeFile;
427 + $includeFile($file);
323 428
324 429 return true;
325 430 }
431 +
432 + return null;
326 433 }
327 434
328 435 /**
329 436 * Finds the path to the file where the class is defined.
@@ -366,8 +473,23 @@
366 473
367 474 return $file;
368 475 }
369 476
477 + /**
478 + * Returns the currently registered loaders keyed by their corresponding vendor directories.
479 + *
480 + * @return array<string, self>
481 + */
482 + public static function getRegisteredLoaders()
483 + {
484 + return self::$registeredLoaders;
485 + }
486 +
487 + /**
488 + * @param string $class
489 + * @param string $ext
490 + * @return string|false
491 + */
370 492 private function findFileWithExtension($class, $ext)
371 493 {
372 494 // PSR-4 lookup
373 495 $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
@@ -431,15 +553,27 @@
431 553 }
432 554
433 555 return false;
434 556 }
435 -}
436 557
437 -/**
438 - * Scope isolated include.
439 - *
440 - * Prevents access to $this/self from included files.
441 - */
442 -function includeFile($file)
443 -{
444 - include $file;
558 + /**
559 + * @return void
560 + */
561 + private static function initializeIncludeClosure()
562 + {
563 + if (self::$includeFile !== null) {
564 + return;
565 + }
566 +
567 + /**
568 + * Scope isolated include.
569 + *
570 + * Prevents access to $this/self from included files.
571 + *
572 + * @param string $file
573 + * @return void
574 + */
575 + self::$includeFile = \Closure::bind(static function($file) {
576 + include $file;
577 + }, null, null);
578 + }
445 579 }