_namespacePrefixesToBaseDirectories[$prefix])) { $this->_namespacePrefixesToBaseDirectories[$prefix] = []; } if (true === $prepend) { array_unshift( $this->_namespacePrefixesToBaseDirectories[$prefix], $baseDirectory ); } else { array_push( $this->_namespacePrefixesToBaseDirectories[$prefix], $baseDirectory ); } return; } /** * Try to load the entity file for a given entity name. * * @param string $entity Entity name to load. * @return bool */ public function load($entity) { $entityPrefix = $entity; $hasBaseDirectory = false; while (false !== $pos = strrpos($entityPrefix, '\\')) { $currentEntityPrefix = substr($entity, 0, $pos + 1); $entityPrefix = rtrim($currentEntityPrefix, '\\'); $entitySuffix = substr($entity, $pos + 1); $entitySuffixAsPath = str_replace('\\', '/', $entitySuffix); if (false === $this->hasBaseDirectory($currentEntityPrefix)) { continue; } $hasBaseDirectory = true; foreach ($this->getBaseDirectories($currentEntityPrefix) as $baseDirectory) { $file = $baseDirectory . $entitySuffixAsPath . '.php'; if (false !== $this->requireFile($file)) { return $file; } } } if (true === $hasBaseDirectory && $entity === Consistency::getEntityShortestName($entity) && false !== $pos = strrpos($entity, '\\')) { return $this->runAutoloaderStack( $entity . '\\' . substr($entity, $pos + 1) ); } return null; } /** * Require a file if exists. * * @param string $filename File name. * @return bool */ public function requireFile($filename) { if (false === file_exists($filename)) { return false; } require $filename; return true; } /** * Check whether at least one base directory exists for a namespace prefix. * * @param string $namespacePrefix Namespace prefix. * @return bool */ public function hasBaseDirectory($namespacePrefix) { return isset($this->_namespacePrefixesToBaseDirectories[$namespacePrefix]); } /** * Get declared base directories for a namespace prefix. * * @param string $namespacePrefix Namespace prefix. * @return array */ public function getBaseDirectories($namespacePrefix) { if (false === $this->hasBaseDirectory($namespacePrefix)) { return []; } return $this->_namespacePrefixesToBaseDirectories[$namespacePrefix]; } /** * Get loaded classes. * * @return array */ public static function getLoadedClasses() { return get_declared_classes(); } /** * Run the entire autoloader stack with a specific entity. * * @param string $entity Entity name to load. * @return void */ public function runAutoloaderStack($entity) { return spl_autoload_call($entity); } /** * Register the autoloader. * * @param bool $prepend Prepend this autoloader to the stack or not. * @return bool */ public function register($prepend = false) { return spl_autoload_register([$this, 'load'], true, $prepend); } /** * Unregister the autoloader. * * @return bool */ public function unregister() { return spl_autoload_unregister([$this, 'load']); } /** * Get all registered autoloaders (not only from this library). * * @return array */ public function getRegisteredAutoloaders() { return spl_autoload_functions(); } /** * Dynamic new, a simple factory. * It loads and constructs a class, with provided arguments. * * @param bool $classname Classname. * @param array $arguments Arguments for the constructor. * @return object */ public static function dnew($classname, array $arguments = []) { $classname = ltrim($classname, '\\'); if (false === Consistency::entityExists($classname, false)) { spl_autoload_call($classname); } $class = new \ReflectionClass($classname); if (empty($arguments) || false === $class->hasMethod('__construct')) { return $class->newInstance(); } return $class->newInstanceArgs($arguments); } } /** * Autoloader. */ $autoloader = new Autoloader(); $autoloader->addNamespace('Hoa', dirname(__DIR__)); $autoloader->register();