代码之家  ›  专栏  ›  技术社区  ›  robue-a7119895

此自动加载器仅加载第一类

  •  0
  • robue-a7119895  · 技术社区  · 11 年前

    我有以下自动加载器,出于某种原因,它只加载第一个类。

    这是Autoloader类

    <?php 
     class AutoloaderException extends Exception{}
    
    class AutoLoader
    {
        private $classDir; 
        private $namespace; 
        public $dirSeparatorSymbol = '\\'; 
    
        public function __construct($namespace, $classDir)
        {
            $this->classDir = $classDir; 
            $this->namespace = $namespace;
    
        }
    
        private function load($class)
        {
    
            $include_path = str_replace($this->dirSeparatorSymbol, DIRECTORY_SEPARATOR, $this->classDir);
    
            $classFilename = strtolower(substr($class, strrpos($class, '\\') + 1) . '.php');
    
            if(file_exists($include_path.$classFilename)){
                require $include_path.$classFilename;
    
                return true; 
            }
    
    
            throw new AutoloaderException('Class '.$classFilename. ' could not be loaded'); 
        }   
    
        public function register()
        {
            spl_autoload_register([$this, 'load']);
        }
    }
    

    虽然上述方法有效,但一次只加载一个类。因此,在下面的示例中。 对于每个注册的路径/类,只会加载第一个。

    $b = new Autoloader('mercury\venus\earth', __DIR__.'/mercury/venus/earth/');
    $b->register();
    
    $a = new Autoloader('bar\tar', __DIR__.'/foo/bar/tar/');
    $a->register();
    
    
    $x = new bar\tar;
    
    $y = new mercury\venus\earth;
    

    这可能有什么问题?

    1 回复  |  直到 11 年前
        1
  •  1
  •   sectus    11 年前

    如果必须有多个自动加载函数,spl_autoload_register()允许这样做。它有效地创建了一个自动加载函数队列,并按照定义的顺序运行每个函数。

    http://php.net/manual/en/function.spl-autoload-register.php

    这是排队。若第一个自动加载函数未定义类,则第二个自动加载功能将运行。

    因此,您不需要在自动加载方法中抛出异常,因为它会阻止在自动加载队列中启动第二个自动加载方法。