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

时间:2014-08-12 22:37:27

标签: php oop spl-autoload-register psr-0

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

这是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 个答案:

答案 0 :(得分:1)

  

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

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

它的队列。如果第一个自动加载功能没有定义类,则会运行第二个自动加载功能。

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