0

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

这是自动加载器类

<?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;

这可能是什么问题?

4

1 回答 1

1

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

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

是排队。如果第一个自动加载函数未定义类,则第二个自动加载函数将运行。

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

于 2014-08-13T11:46:20.270 回答