public function loadClass($className)
{
if ($className[0] === '\\') {
$className = ltrim($className, '\\');
}
$namespaceParts = explode('\\', $className);
// Workaround for Doctrine's annotation parser which does a class_exists() for annotations like "@param" and so on:
if (isset($this->ignoredClassNames[$className]) || isset($this->ignoredClassNames[end($namespaceParts)]) || isset($this->nonExistentClasses[$className])) {
return false;
}
// Loads any known proxied class:
if ($this->classesCache !== null && ($this->availableProxyClasses === null || isset($this->availableProxyClasses[implode('_', $namespaceParts)])) && $this->classesCache->requireOnce(implode('_', $namespaceParts)) !== false) {
return true;
}
$classNamePart = array_pop($namespaceParts);
$classNameParts = explode('_', $classNamePart);
$namespaceParts = array_merge($namespaceParts, $classNameParts);
$namespacePartCount = count($namespaceParts);
$currentPackageArray = $this->packageNamespaces;
$packagenamespacePartCount = 0;
// This will contain all possible class mappings for the given class name. We start with the fallback paths and prepend mappings with growing specificy.
$collectedPossibleNamespaceMappings = [['p' => $this->fallbackClassPaths, 'c' => 0]];
if ($namespacePartCount > 1) {
while ($packagenamespacePartCount + 1 < $namespacePartCount) {
$possiblePackageNamespacePart = $namespaceParts[$packagenamespacePartCount];
if (!isset($currentPackageArray[$possiblePackageNamespacePart])) {
break;
}
$packagenamespacePartCount++;
$currentPackageArray = $currentPackageArray[$possiblePackageNamespacePart];
if (isset($currentPackageArray['_pathData'])) {
array_unshift($collectedPossibleNamespaceMappings, ['p' => $currentPackageArray['_pathData'], 'c' => $packagenamespacePartCount]);
}
}
}
foreach ($collectedPossibleNamespaceMappings as $nameSpaceMapping) {
if ($this->loadClassFromPossiblePaths($nameSpaceMapping['p'], $namespaceParts, $nameSpaceMapping['c'])) {
return true;
}
}
$this->nonExistentClasses[$className] = true;
return false;
}