Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/code-snippets/vendor/composer/ClassLoader.php
Keine Baseline-Datei – Diff nur gegen leer.
1
-
1
+
<?php
2
+
3
+
/*
4
+
* This file is part of Composer.
5
+
*
6
+
* (c) Nils Adermann <naderman@naderman.de>
7
+
* Jordi Boggiano <j.boggiano@seld.be>
8
+
*
9
+
* For the full copyright and license information, please view the LICENSE
10
+
* file that was distributed with this source code.
11
+
*/
12
+
13
+
namespace Composer\Autoload;
14
+
15
+
/**
16
+
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
17
+
*
18
+
* $loader = new \Composer\Autoload\ClassLoader();
19
+
*
20
+
* // register classes with namespaces
21
+
* $loader->add('Symfony\Component', __DIR__.'/component');
22
+
* $loader->add('Symfony', __DIR__.'/framework');
23
+
*
24
+
* // activate the autoloader
25
+
* $loader->register();
26
+
*
27
+
* // to enable searching the include path (eg. for PEAR packages)
28
+
* $loader->setUseIncludePath(true);
29
+
*
30
+
* In this example, if you try to use a class in the Symfony\Component
31
+
* namespace or one of its children (Symfony\Component\Console for instance),
32
+
* the autoloader will first look for the class under the component/
33
+
* directory, and it will then fallback to the framework/ directory if not
34
+
* found before giving up.
35
+
*
36
+
* This class is loosely based on the Symfony UniversalClassLoader.
37
+
*
38
+
* @author Fabien Potencier <fabien@symfony.com>
39
+
* @author Jordi Boggiano <j.boggiano@seld.be>
40
+
* @see https://www.php-fig.org/psr/psr-0/
41
+
* @see https://www.php-fig.org/psr/psr-4/
42
+
*/
43
+
class ClassLoader
44
+
{
45
+
/** @var \Closure(string):void */
46
+
private static $includeFile;
47
+
48
+
/** @var string|null */
49
+
private $vendorDir;
50
+
51
+
// PSR-4
52
+
/**
53
+
* @var array<string, array<string, int>>
54
+
*/
55
+
private $prefixLengthsPsr4 = array();
56
+
/**
57
+
* @var array<string, list<string>>
58
+
*/
59
+
private $prefixDirsPsr4 = array();
60
+
/**
61
+
* @var list<string>
62
+
*/
63
+
private $fallbackDirsPsr4 = array();
64
+
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
+
*/
73
+
private $prefixesPsr0 = array();
74
+
/**
75
+
* @var list<string>
76
+
*/
77
+
private $fallbackDirsPsr0 = array();
78
+
79
+
/** @var bool */
80
+
private $useIncludePath = false;
81
+
82
+
/**
83
+
* @var array<string, string>
84
+
*/
85
+
private $classMap = array();
86
+
87
+
/** @var bool */
88
+
private $classMapAuthoritative = false;
89
+
90
+
/**
91
+
* @var array<string, bool>
92
+
*/
93
+
private $missingClasses = array();
94
+
95
+
/** @var string|null */
96
+
private $apcuPrefix;
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
+
*/
115
+
public function getPrefixes()
116
+
{
117
+
if (!empty($this->prefixesPsr0)) {
118
+
return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
119
+
}
120
+
121
+
return array();
122
+
}
123
+
124
+
/**
125
+
* @return array<string, list<string>>
126
+
*/
127
+
public function getPrefixesPsr4()
128
+
{
129
+
return $this->prefixDirsPsr4;
130
+
}
131
+
132
+
/**
133
+
* @return list<string>
134
+
*/
135
+
public function getFallbackDirs()
136
+
{
137
+
return $this->fallbackDirsPsr0;
138
+
}
139
+
140
+
/**
141
+
* @return list<string>
142
+
*/
143
+
public function getFallbackDirsPsr4()
144
+
{
145
+
return $this->fallbackDirsPsr4;
146
+
}
147
+
148
+
/**
149
+
* @return array<string, string> Array of classname => path
150
+
*/
151
+
public function getClassMap()
152
+
{
153
+
return $this->classMap;
154
+
}
155
+
156
+
/**
157
+
* @param array<string, string> $classMap Class to filename map
158
+
*
159
+
* @return void
160
+
*/
161
+
public function addClassMap(array $classMap)
162
+
{
163
+
if ($this->classMap) {
164
+
$this->classMap = array_merge($this->classMap, $classMap);
165
+
} else {
166
+
$this->classMap = $classMap;
167
+
}
168
+
}
169
+
170
+
/**
171
+
* Registers a set of PSR-0 directories for a given prefix, either
172
+
* appending or prepending to the ones previously set for this prefix.
173
+
*
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
179
+
*/
180
+
public function add($prefix, $paths, $prepend = false)
181
+
{
182
+
$paths = (array) $paths;
183
+
if (!$prefix) {
184
+
if ($prepend) {
185
+
$this->fallbackDirsPsr0 = array_merge(
186
+
$paths,
187
+
$this->fallbackDirsPsr0
188
+
);
189
+
} else {
190
+
$this->fallbackDirsPsr0 = array_merge(
191
+
$this->fallbackDirsPsr0,
192
+
$paths
193
+
);
194
+
}
195
+
196
+
return;
197
+
}
198
+
199
+
$first = $prefix[0];
200
+
if (!isset($this->prefixesPsr0[$first][$prefix])) {
201
+
$this->prefixesPsr0[$first][$prefix] = $paths;
202
+
203
+
return;
204
+
}
205
+
if ($prepend) {
206
+
$this->prefixesPsr0[$first][$prefix] = array_merge(
207
+
$paths,
208
+
$this->prefixesPsr0[$first][$prefix]
209
+
);
210
+
} else {
211
+
$this->prefixesPsr0[$first][$prefix] = array_merge(
212
+
$this->prefixesPsr0[$first][$prefix],
213
+
$paths
214
+
);
215
+
}
216
+
}
217
+
218
+
/**
219
+
* Registers a set of PSR-4 directories for a given namespace, either
220
+
* appending or prepending to the ones previously set for this namespace.
221
+
*
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
225
+
*
226
+
* @throws \InvalidArgumentException
227
+
*
228
+
* @return void
229
+
*/
230
+
public function addPsr4($prefix, $paths, $prepend = false)
231
+
{
232
+
$paths = (array) $paths;
233
+
if (!$prefix) {
234
+
// Register directories for the root namespace.
235
+
if ($prepend) {
236
+
$this->fallbackDirsPsr4 = array_merge(
237
+
$paths,
238
+
$this->fallbackDirsPsr4
239
+
);
240
+
} else {
241
+
$this->fallbackDirsPsr4 = array_merge(
242
+
$this->fallbackDirsPsr4,
243
+
$paths
244
+
);
245
+
}
246
+
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
247
+
// Register directories for a new namespace.
248
+
$length = strlen($prefix);
249
+
if ('\\' !== $prefix[$length - 1]) {
250
+
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
251
+
}
252
+
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
253
+
$this->prefixDirsPsr4[$prefix] = $paths;
254
+
} elseif ($prepend) {
255
+
// Prepend directories for an already registered namespace.
256
+
$this->prefixDirsPsr4[$prefix] = array_merge(
257
+
$paths,
258
+
$this->prefixDirsPsr4[$prefix]
259
+
);
260
+
} else {
261
+
// Append directories for an already registered namespace.
262
+
$this->prefixDirsPsr4[$prefix] = array_merge(
263
+
$this->prefixDirsPsr4[$prefix],
264
+
$paths
265
+
);
266
+
}
267
+
}
268
+
269
+
/**
270
+
* Registers a set of PSR-0 directories for a given prefix,
271
+
* replacing any others previously set for this prefix.
272
+
*
273
+
* @param string $prefix The prefix
274
+
* @param list<string>|string $paths The PSR-0 base directories
275
+
*
276
+
* @return void
277
+
*/
278
+
public function set($prefix, $paths)
279
+
{
280
+
if (!$prefix) {
281
+
$this->fallbackDirsPsr0 = (array) $paths;
282
+
} else {
283
+
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
284
+
}
285
+
}
286
+
287
+
/**
288
+
* Registers a set of PSR-4 directories for a given namespace,
289
+
* replacing any others previously set for this namespace.
290
+
*
291
+
* @param string $prefix The prefix/namespace, with trailing '\\'
292
+
* @param list<string>|string $paths The PSR-4 base directories
293
+
*
294
+
* @throws \InvalidArgumentException
295
+
*
296
+
* @return void
297
+
*/
298
+
public function setPsr4($prefix, $paths)
299
+
{
300
+
if (!$prefix) {
301
+
$this->fallbackDirsPsr4 = (array) $paths;
302
+
} else {
303
+
$length = strlen($prefix);
304
+
if ('\\' !== $prefix[$length - 1]) {
305
+
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
306
+
}
307
+
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
308
+
$this->prefixDirsPsr4[$prefix] = (array) $paths;
309
+
}
310
+
}
311
+
312
+
/**
313
+
* Turns on searching the include path for class files.
314
+
*
315
+
* @param bool $useIncludePath
316
+
*
317
+
* @return void
318
+
*/
319
+
public function setUseIncludePath($useIncludePath)
320
+
{
321
+
$this->useIncludePath = $useIncludePath;
322
+
}
323
+
324
+
/**
325
+
* Can be used to check if the autoloader uses the include path to check
326
+
* for classes.
327
+
*
328
+
* @return bool
329
+
*/
330
+
public function getUseIncludePath()
331
+
{
332
+
return $this->useIncludePath;
333
+
}
334
+
335
+
/**
336
+
* Turns off searching the prefix and fallback directories for classes
337
+
* that have not been registered with the class map.
338
+
*
339
+
* @param bool $classMapAuthoritative
340
+
*
341
+
* @return void
342
+
*/
343
+
public function setClassMapAuthoritative($classMapAuthoritative)
344
+
{
345
+
$this->classMapAuthoritative = $classMapAuthoritative;
346
+
}
347
+
348
+
/**
349
+
* Should class lookup fail if not found in the current class map?
350
+
*
351
+
* @return bool
352
+
*/
353
+
public function isClassMapAuthoritative()
354
+
{
355
+
return $this->classMapAuthoritative;
356
+
}
357
+
358
+
/**
359
+
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
360
+
*
361
+
* @param string|null $apcuPrefix
362
+
*
363
+
* @return void
364
+
*/
365
+
public function setApcuPrefix($apcuPrefix)
366
+
{
367
+
$this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
368
+
}
369
+
370
+
/**
371
+
* The APCu prefix in use, or null if APCu caching is not enabled.
372
+
*
373
+
* @return string|null
374
+
*/
375
+
public function getApcuPrefix()
376
+
{
377
+
return $this->apcuPrefix;
378
+
}
379
+
380
+
/**
381
+
* Registers this instance as an autoloader.
382
+
*
383
+
* @param bool $prepend Whether to prepend the autoloader or not
384
+
*
385
+
* @return void
386
+
*/
387
+
public function register($prepend = false)
388
+
{
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
+
}
401
+
}
402
+
403
+
/**
404
+
* Unregisters this instance as an autoloader.
405
+
*
406
+
* @return void
407
+
*/
408
+
public function unregister()
409
+
{
410
+
spl_autoload_unregister(array($this, 'loadClass'));
411
+
412
+
if (null !== $this->vendorDir) {
413
+
unset(self::$registeredLoaders[$this->vendorDir]);
414
+
}
415
+
}
416
+
417
+
/**
418
+
* Loads the given class or interface.
419
+
*
420
+
* @param string $class The name of the class
421
+
* @return true|null True if loaded, null otherwise
422
+
*/
423
+
public function loadClass($class)
424
+
{
425
+
if ($file = $this->findFile($class)) {
426
+
$includeFile = self::$includeFile;
427
+
$includeFile($file);
428
+
429
+
return true;
430
+
}
431
+
432
+
return null;
433
+
}
434
+
435
+
/**
436
+
* Finds the path to the file where the class is defined.
437
+
*
438
+
* @param string $class The name of the class
439
+
*
440
+
* @return string|false The path if found, false otherwise
441
+
*/
442
+
public function findFile($class)
443
+
{
444
+
// class map lookup
445
+
if (isset($this->classMap[$class])) {
446
+
return $this->classMap[$class];
447
+
}
448
+
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
449
+
return false;
450
+
}
451
+
if (null !== $this->apcuPrefix) {
452
+
$file = apcu_fetch($this->apcuPrefix.$class, $hit);
453
+
if ($hit) {
454
+
return $file;
455
+
}
456
+
}
457
+
458
+
$file = $this->findFileWithExtension($class, '.php');
459
+
460
+
// Search for Hack files if we are running on HHVM
461
+
if (false === $file && defined('HHVM_VERSION')) {
462
+
$file = $this->findFileWithExtension($class, '.hh');
463
+
}
464
+
465
+
if (null !== $this->apcuPrefix) {
466
+
apcu_add($this->apcuPrefix.$class, $file);
467
+
}
468
+
469
+
if (false === $file) {
470
+
// Remember that this class does not exist.
471
+
$this->missingClasses[$class] = true;
472
+
}
473
+
474
+
return $file;
475
+
}
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
+
*/
492
+
private function findFileWithExtension($class, $ext)
493
+
{
494
+
// PSR-4 lookup
495
+
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
496
+
497
+
$first = $class[0];
498
+
if (isset($this->prefixLengthsPsr4[$first])) {
499
+
$subPath = $class;
500
+
while (false !== $lastPos = strrpos($subPath, '\\')) {
501
+
$subPath = substr($subPath, 0, $lastPos);
502
+
$search = $subPath . '\\';
503
+
if (isset($this->prefixDirsPsr4[$search])) {
504
+
$pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
505
+
foreach ($this->prefixDirsPsr4[$search] as $dir) {
506
+
if (file_exists($file = $dir . $pathEnd)) {
507
+
return $file;
508
+
}
509
+
}
510
+
}
511
+
}
512
+
}
513
+
514
+
// PSR-4 fallback dirs
515
+
foreach ($this->fallbackDirsPsr4 as $dir) {
516
+
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
517
+
return $file;
518
+
}
519
+
}
520
+
521
+
// PSR-0 lookup
522
+
if (false !== $pos = strrpos($class, '\\')) {
523
+
// namespaced class name
524
+
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
525
+
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
526
+
} else {
527
+
// PEAR-like class name
528
+
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
529
+
}
530
+
531
+
if (isset($this->prefixesPsr0[$first])) {
532
+
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
533
+
if (0 === strpos($class, $prefix)) {
534
+
foreach ($dirs as $dir) {
535
+
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
536
+
return $file;
537
+
}
538
+
}
539
+
}
540
+
}
541
+
}
542
+
543
+
// PSR-0 fallback dirs
544
+
foreach ($this->fallbackDirsPsr0 as $dir) {
545
+
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
546
+
return $file;
547
+
}
548
+
}
549
+
550
+
// PSR-0 include paths.
551
+
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
552
+
return $file;
553
+
}
554
+
555
+
return false;
556
+
}
557
+
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
+
}
579
+
}
580
+