PHP:spl_autoload_寄存器试图从错误目录加载文件

PHP:spl_autoload_寄存器试图从错误目录加载文件,php,Php,我正在尝试实现类的自动加载。我将我的类分为两个不同的文件夹: /classes /external 在我的external文件夹中,我保留了我在应用程序中使用的所有第三方内容。它可能包括类、函数等。我喜欢将它们与我自己的代码分开 我想手动包括外部目录中的所有内容。我只希望自动加载classes目录中的文件。以下是我所拥有的: 档案: /classes/cache.class.php /classes/db.class.php /classes.mail.class.php /external/

我正在尝试实现类的自动加载。我将我的类分为两个不同的文件夹:

/classes
/external
在我的
external
文件夹中,我保留了我在应用程序中使用的所有第三方内容。它可能包括类、函数等。我喜欢将它们与我自己的代码分开

我想手动包括
外部
目录中的所有内容。我只希望自动加载
classes
目录中的文件。以下是我所拥有的:

档案:

/classes/cache.class.php
/classes/db.class.php
/classes.mail.class.php
/external/hooks.php
和自动加载:

spl_autoload_register(function ($class_name) {
    include dirname(__FILE__).'/classes/'.$class_name.'.class.php';
});

$Cache  = new cache();
$Db = new db(); 
$Mail = new mail(); 
不知何故,这是试图加载
外部
目录中存在的任何类。我知道这一点,因为在
hooks.php
中,我有:

class Hooks { ... } // Notice the capital H
我得到了一个错误:

“警告:include(/path/to/classes/Hooks.class.php):无法打开流:没有这样的文件或目录”

如何使
spl\u autoload\u register
忽略
classes
目录之外的所有类?

添加此选项

if (file_exists(dirname(__FILE__).'/classes/.$class_name.'.class.php'))

就在include之前,自动加载程序无法知道在哪个文件夹中定义了类。一般流程如下:

  • 查看正在执行的代码中使用的未定义类
  • 调用在spl_autoloader中注册的所有函数,并将未定义的类名传递给它们
由于您没有检查该文件是否存在,因此每当您在使用非自动加载类之前未能包含该类时,您注册的自动加载函数就会出错。正如@Forbs在他的回答中提到的,在包含源文件之前,只需在autoloader函数中添加一个检查,查看该文件是否存在

值得注意的是,Composer已经很好地为您完成了这项工作——除非您有特定的理由想要使用自己的自动加载器,否则我建议您为您的项目设置Composer


谢谢。我只是不明白为什么它在其他目录中搜索,而不是停留在指定的目录中。你能解释一下原因吗?因为你没有展示整个代码,特别是调用
spl\u autoload\u register
的代码,所以我不能给你一个好的答案。最有可能的是,无论调用什么,它都会得到一个预设列表,以便首先尝试。