使用PHP从数组中调用一次类自动加载

时间:2012-05-11 16:17:16

标签: php oop class autoloader

我一直在研究不同的框架以及它们如何实现类的自动加载,但我是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);

我做了什么是错的,我是否正确地做到了这一点?我基本上希望autoload类从引导程序文件映射一个类数组,并在它们被调用/实例化时包含这些文件,并在它们不再使用时停止包含它们。

3 个答案:

答案 0 :(得分:0)

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

对于"classes/Config.php",猜测file_exists失败。

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

答案 1 :(得分:0)

我认为问题来自这一行 - $this->map = array_merge($this->map, $files),因为您将$files传递给$autoload->map() Array,但您正在尝试在String方法中获取find()的值。

答案 2 :(得分:0)

你的“地图”功能似乎有些奇怪。

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

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