diff --git a/autoload.php b/autoload.php index 0dcf1b4c81..ec99ef87fb 100644 --- a/autoload.php +++ b/autoload.php @@ -139,6 +139,37 @@ public static function load($class) }//end load() + /** + * Determine which class was loaded from path + * + * @param array $classesBeforeLoad The classes/interfaces/traits before the file was included. + * @param string $path The path that already has been included. + * + * @return string The fully qualified name of the class in the loaded file. + */ + private static function determinePathClass( + array $classesBeforeLoad, $path + ) { + $alreadyIncluded = in_array($path, get_included_files(), true); + if ($alreadyIncluded === false) { + return null; + } + + $name = pathinfo($path, PATHINFO_FILENAME); + $declared = preg_grep( + '(\\\\'.preg_quote($name).'$)', + $classesBeforeLoad['classes'] + ); + foreach ($declared as $className) { + $reflection = new \ReflectionClass($className); + $classFileName = $reflection->getFileName(); + if ($classFileName === $path) { + return $className; + } + } + + }//end determinePathClass() + /** * Includes a file and tracks what class or interface was loaded as a result. @@ -166,6 +197,12 @@ public static function loadFile($path) 'traits' => get_declared_traits(), ]; + $className = self::determinePathClass($classesBeforeLoad, $path); + + if ($className !== null) { + goto determined_className; + } + include $path; $classesAfterLoad = [ @@ -174,7 +211,12 @@ public static function loadFile($path) 'traits' => get_declared_traits(), ]; - $className = self::determineLoadedClass($classesBeforeLoad, $classesAfterLoad); + $className = self::determineLoadedClass( + $classesBeforeLoad, + $classesAfterLoad + ); + + determined_className: self::$loadedClasses[$path] = $className; self::$loadedFiles[$className] = $path;