这个自动加载器只加载第一个类



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

这是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('mercuryvenusearth', __DIR__.'/mercury/venus/earth/');
$b->register();
$a = new Autoloader('bartar', __DIR__.'/foo/bar/tar/');
$a->register();

$x = new bartar;
$y = new mercuryvenusearth;

这可能是什么问题?

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

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

队列。如果第一个自动加载函数没有定义类,则第二个自动加载函数将运行。

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

最新更新