PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 3.3.1
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v3.3.1
3.3.1 V-3.3.0 3.2.2 3.2.1 3.2.0 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 V3.0.3 V3.0.2 -3.0.1 V_3.0.0 1.1.1 1.1.8 1.2 1.3 1.4 1.4.18 1.5.2 1.9 2.0 2.10.0 2.10.1 All 138 releases
← All changes | vendor/composer/ClassLoader.php +166 -32 1.23.3.1 View file →
@@ -41,23 +41,78 @@
41 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 118 return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
@@ -65,23 +120,35 @@
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 }