|
|
|
@ -42,30 +42,75 @@ namespace Composer\Autoload;
|
|
|
|
|
*/
|
|
|
|
|
class ClassLoader
|
|
|
|
|
{
|
|
|
|
|
/** @var ?string */
|
|
|
|
|
private $vendorDir;
|
|
|
|
|
|
|
|
|
|
// PSR-4
|
|
|
|
|
/**
|
|
|
|
|
* @var array[]
|
|
|
|
|
* @psalm-var array<string, array<string, int>>
|
|
|
|
|
*/
|
|
|
|
|
private $prefixLengthsPsr4 = array();
|
|
|
|
|
/**
|
|
|
|
|
* @var array[]
|
|
|
|
|
* @psalm-var array<string, array<int, string>>
|
|
|
|
|
*/
|
|
|
|
|
private $prefixDirsPsr4 = array();
|
|
|
|
|
/**
|
|
|
|
|
* @var array[]
|
|
|
|
|
* @psalm-var array<string, string>
|
|
|
|
|
*/
|
|
|
|
|
private $fallbackDirsPsr4 = array();
|
|
|
|
|
|
|
|
|
|
// PSR-0
|
|
|
|
|
/**
|
|
|
|
|
* @var array[]
|
|
|
|
|
* @psalm-var array<string, array<string, string[]>>
|
|
|
|
|
*/
|
|
|
|
|
private $prefixesPsr0 = array();
|
|
|
|
|
/**
|
|
|
|
|
* @var array[]
|
|
|
|
|
* @psalm-var array<string, string>
|
|
|
|
|
*/
|
|
|
|
|
private $fallbackDirsPsr0 = array();
|
|
|
|
|
|
|
|
|
|
/** @var bool */
|
|
|
|
|
private $useIncludePath = false;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @var string[]
|
|
|
|
|
* @psalm-var array<string, string>
|
|
|
|
|
*/
|
|
|
|
|
private $classMap = array();
|
|
|
|
|
|
|
|
|
|
/** @var bool */
|
|
|
|
|
private $classMapAuthoritative = false;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @var bool[]
|
|
|
|
|
* @psalm-var array<string, bool>
|
|
|
|
|
*/
|
|
|
|
|
private $missingClasses = array();
|
|
|
|
|
|
|
|
|
|
/** @var ?string */
|
|
|
|
|
private $apcuPrefix;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @var self[]
|
|
|
|
|
*/
|
|
|
|
|
private static $registeredLoaders = array();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param ?string $vendorDir
|
|
|
|
|
*/
|
|
|
|
|
public function __construct($vendorDir = null)
|
|
|
|
|
{
|
|
|
|
|
$this->vendorDir = $vendorDir;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @return string[]
|
|
|
|
|
*/
|
|
|
|
|
public function getPrefixes()
|
|
|
|
|
{
|
|
|
|
|
if (!empty($this->prefixesPsr0)) {
|
|
|
|
@ -75,28 +120,47 @@ class ClassLoader
|
|
|
|
|
return array();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @return array[]
|
|
|
|
|
* @psalm-return array<string, array<int, string>>
|
|
|
|
|
*/
|
|
|
|
|
public function getPrefixesPsr4()
|
|
|
|
|
{
|
|
|
|
|
return $this->prefixDirsPsr4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @return array[]
|
|
|
|
|
* @psalm-return array<string, string>
|
|
|
|
|
*/
|
|
|
|
|
public function getFallbackDirs()
|
|
|
|
|
{
|
|
|
|
|
return $this->fallbackDirsPsr0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @return array[]
|
|
|
|
|
* @psalm-return array<string, string>
|
|
|
|
|
*/
|
|
|
|
|
public function getFallbackDirsPsr4()
|
|
|
|
|
{
|
|
|
|
|
return $this->fallbackDirsPsr4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @return string[] Array of classname => path
|
|
|
|
|
* @psalm-return array<string, string>
|
|
|
|
|
*/
|
|
|
|
|
public function getClassMap()
|
|
|
|
|
{
|
|
|
|
|
return $this->classMap;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param array $classMap Class to filename map
|
|
|
|
|
* @param string[] $classMap Class to filename map
|
|
|
|
|
* @psalm-param array<string, string> $classMap
|
|
|
|
|
*
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
|
|
|
|
public function addClassMap(array $classMap)
|
|
|
|
|
{
|
|
|
|
@ -111,9 +175,11 @@ class ClassLoader
|
|
|
|
|
* Registers a set of PSR-0 directories for a given prefix, either
|
|
|
|
|
* appending or prepending to the ones previously set for this prefix.
|
|
|
|
|
*
|
|
|
|
|
* @param string $prefix The prefix
|
|
|
|
|
* @param array|string $paths The PSR-0 root directories
|
|
|
|
|
* @param bool $prepend Whether to prepend the directories
|
|
|
|
|
* @param string $prefix The prefix
|
|
|
|
|
* @param string[]|string $paths The PSR-0 root directories
|
|
|
|
|
* @param bool $prepend Whether to prepend the directories
|
|
|
|
|
*
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
|
|
|
|
public function add($prefix, $paths, $prepend = false)
|
|
|
|
|
{
|
|
|
|
@ -156,11 +222,13 @@ class ClassLoader
|
|
|
|
|
* Registers a set of PSR-4 directories for a given namespace, either
|
|
|
|
|
* appending or prepending to the ones previously set for this namespace.
|
|
|
|
|
*
|
|
|
|
|
* @param string $prefix The prefix/namespace, with trailing '\\'
|
|
|
|
|
* @param array|string $paths The PSR-4 base directories
|
|
|
|
|
* @param bool $prepend Whether to prepend the directories
|
|
|
|
|
* @param string $prefix The prefix/namespace, with trailing '\\'
|
|
|
|
|
* @param string[]|string $paths The PSR-4 base directories
|
|
|
|
|
* @param bool $prepend Whether to prepend the directories
|
|
|
|
|
*
|
|
|
|
|
* @throws \InvalidArgumentException
|
|
|
|
|
*
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
|
|
|
|
public function addPsr4($prefix, $paths, $prepend = false)
|
|
|
|
|
{
|
|
|
|
@ -204,8 +272,10 @@ class ClassLoader
|
|
|
|
|
* Registers a set of PSR-0 directories for a given prefix,
|
|
|
|
|
* replacing any others previously set for this prefix.
|
|
|
|
|
*
|
|
|
|
|
* @param string $prefix The prefix
|
|
|
|
|
* @param array|string $paths The PSR-0 base directories
|
|
|
|
|
* @param string $prefix The prefix
|
|
|
|
|
* @param string[]|string $paths The PSR-0 base directories
|
|
|
|
|
*
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
|
|
|
|
public function set($prefix, $paths)
|
|
|
|
|
{
|
|
|
|
@ -220,10 +290,12 @@ class ClassLoader
|
|
|
|
|
* Registers a set of PSR-4 directories for a given namespace,
|
|
|
|
|
* replacing any others previously set for this namespace.
|
|
|
|
|
*
|
|
|
|
|
* @param string $prefix The prefix/namespace, with trailing '\\'
|
|
|
|
|
* @param array|string $paths The PSR-4 base directories
|
|
|
|
|
* @param string $prefix The prefix/namespace, with trailing '\\'
|
|
|
|
|
* @param string[]|string $paths The PSR-4 base directories
|
|
|
|
|
*
|
|
|
|
|
* @throws \InvalidArgumentException
|
|
|
|
|
*
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
|
|
|
|
public function setPsr4($prefix, $paths)
|
|
|
|
|
{
|
|
|
|
@ -243,6 +315,8 @@ class ClassLoader
|
|
|
|
|
* Turns on searching the include path for class files.
|
|
|
|
|
*
|
|
|
|
|
* @param bool $useIncludePath
|
|
|
|
|
*
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
|
|
|
|
public function setUseIncludePath($useIncludePath)
|
|
|
|
|
{
|
|
|
|
@ -265,6 +339,8 @@ class ClassLoader
|
|
|
|
|
* that have not been registered with the class map.
|
|
|
|
|
*
|
|
|
|
|
* @param bool $classMapAuthoritative
|
|
|
|
|
*
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
|
|
|
|
public function setClassMapAuthoritative($classMapAuthoritative)
|
|
|
|
|
{
|
|
|
|
@ -285,6 +361,8 @@ class ClassLoader
|
|
|
|
|
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
|
|
|
|
|
*
|
|
|
|
|
* @param string|null $apcuPrefix
|
|
|
|
|
*
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
|
|
|
|
public function setApcuPrefix($apcuPrefix)
|
|
|
|
|
{
|
|
|
|
@ -305,6 +383,8 @@ class ClassLoader
|
|
|
|
|
* Registers this instance as an autoloader.
|
|
|
|
|
*
|
|
|
|
|
* @param bool $prepend Whether to prepend the autoloader or not
|
|
|
|
|
*
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
|
|
|
|
public function register($prepend = false)
|
|
|
|
|
{
|
|
|
|
@ -324,6 +404,8 @@ class ClassLoader
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Unregisters this instance as an autoloader.
|
|
|
|
|
*
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
|
|
|
|
public function unregister()
|
|
|
|
|
{
|
|
|
|
@ -403,6 +485,11 @@ class ClassLoader
|
|
|
|
|
return self::$registeredLoaders;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param string $class
|
|
|
|
|
* @param string $ext
|
|
|
|
|
* @return string|false
|
|
|
|
|
*/
|
|
|
|
|
private function findFileWithExtension($class, $ext)
|
|
|
|
|
{
|
|
|
|
|
// PSR-4 lookup
|
|
|
|
@ -474,6 +561,10 @@ class ClassLoader
|
|
|
|
|
* Scope isolated include.
|
|
|
|
|
*
|
|
|
|
|
* Prevents access to $this/self from included files.
|
|
|
|
|
*
|
|
|
|
|
* @param string $file
|
|
|
|
|
* @return void
|
|
|
|
|
* @private
|
|
|
|
|
*/
|
|
|
|
|
function includeFile($file)
|
|
|
|
|
{
|
|
|
|
|