我一直在研究不同的框架以及它们如何实现类的自动加载,但我是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类从引导程序文件映射一个类数组,并在它们被调用/实例化时包含这些文件,并在它们不再使用时停止包含它们。
答案 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,就像它是一个字符串一样!
我认为你需要再看看你如何调用你的函数并跟踪在哪里使用的参数。