我有以下自动加载器,由于某种原因只加载第一个类。
这是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;
这可能是什么问题?
答案 0 :(得分:1)
如果必须有多个自动加载功能,spl_autoload_register()允许这样做。它有效地创建了一个自动加载功能队列,并按照它们的定义顺序遍历每个功能。
http://php.net/manual/en/function.spl-autoload-register.php
它的队列。如果第一个自动加载功能没有定义类,则会运行第二个自动加载功能。
因此,您不需要在自动加载方法中抛出异常,因为它会阻止在自动加载队列中启动第二个自动加载方法。