1

我一直在研究不同的框架以及它们如何实现类的自动加载,但我是 PHP 新手,所以不确定我是否正确解释了它的函数。我试图创建自己的类,仅使用它来自动加载我的所有类,无法访问这些类。这是我的代码的样子:

class Autoloader {
    private $map = array();
    private $directories = array();

    public function register() {
        spl_autoload_register(array($this, 'load'));
    }
    public function unregister() {
        spl_autoload_unregister(array($this, 'load'));
    }
    public function map($files) {
        $this->map = array_merge($this->map, $files);
        $this->load($this->map);
    }
    public function directory($folder) {
        $this->directories = array_merge($this->directories, $folder);
    }
    public function load($class) {
        if ($file = $this->find($class)) {
            require $file;
        }
    }
    public function find($file) {
        foreach ($this->directories as $path) {
            if (file_exists($path . $file . '.php')) {
                return $path . $file . '.php';
            }
        }
    }
}

我像这样从我的引导文件中加载类

require('classes/autoload.php');

$autoload = new Autoloader();
$autoload->map(array(
    'Config' => 'classes/config.php',
    'Sql' => 'classes/db.php'
));

$autoload->directory(array(
    'classes/'
));

$autoload->register();

然后我尝试实例化已映射的类之一

$sql = new SQL($dbinfo);
$sql->query($query);

我所做的有什么问题,我做对了吗?我基本上希望自动加载类从引导文件映射一组类,并在它们被调用/实例化时包含这些文件,并在它们不再使用时停止包含它们。

4

3 回答 3

0

您的“地图”功能似乎发生了一些奇怪的事情。

当 map 被调用时,它传递一个数组来加载,但是加载函数似乎期望 $class 在 find 函数中使用,就好像它是一个字符串一样!

我认为你需要再看看你如何调用你的函数并跟踪在哪里使用了哪些参数。

于 2012-05-11T16:31:53.050 回答
0

您的课程似乎被称为Config您的文件config(注意区分大小写)。

猜测 file_exists 失败"classes/Config.php"

您目前根本没有使用您的地图。

于 2012-05-11T16:27:50.290 回答
0

我认为问题出在这一行 -$this->map = array_merge($this->map, $files)因为你传递$files$autoload->map()as Array,但你试图获取方法中的Stringfind()

于 2012-05-11T16:30:30.577 回答