Php 使用spl自动加载寄存器时出错

Php 使用spl自动加载寄存器时出错,php,spl-autoload-register,Php,Spl Autoload Register,这在init.php上运行良好 include 'models/m_app.php'; include 'views/v_app.php'; include 'controllers/c_app.php'; 但是spl\u autoload\u register()不工作 spl_autoload_register(function ($class) { include 'models/' . $class . '.class.php'; include 'views/' .

这在
init.php上运行良好

include 'models/m_app.php';
include 'views/v_app.php';
include 'controllers/c_app.php';
但是
spl\u autoload\u register()
不工作

spl_autoload_register(function ($class) {
    include 'models/' . $class . '.class.php';
    include 'views/' . $class . '.class.php';
    include 'controllers/' . $class . '.class.php';
});
我得到了这样的错误

Warning: include(models/Model.class.php): failed to open stream: No such file or directory in C:\wamp\www\App\core\init.php on line 3
Warning: include(): Failed opening 'models/Model.class.php' for inclusion (include_path='.;C:\php\pear') in C:\wamp\www\App\core\init.php on line 3
Warning: include(views/Model.class.php): failed to open stream: No such file or directory in C:\wamp\www\App\core\init.php on line 4
Warning: include(): Failed opening 'views/Model.class.php' for inclusion (include_path='.;C:\php\pear') in C:\wamp\www\App\core\init.php on line 4
Warning: include(controllers/Model.class.php): failed to open stream: No such file or directory in C:\wamp\www\App\core\init.php on line 5
Warning: include(): Failed opening 'controllers/Model.class.php' for inclusion (include_path='.;C:\php\pear') in C:\wamp\www\App\core\init.php on line 5

您能告诉我发生这种情况的原因吗?

您使用的spl\u自动加载\u寄存器功能不正确

当您试图创建一个不存在的类时,将调用自动加载函数

正确的方法是按照文件中的类命名文件,并添加一个类似.class.php的结尾:

View.class.php
Model.class.php
Controller.class.php
自动加载器:

spl_autoload_register(function ($class) {
    set_include_path('views/' . PATH_SEPARATOR . 'controllers/' . PATH_SEPARATOR . 'models/');
    include $class . '.class.php';
});
为了测试它:

$test1 = new Model();
$test2 = new Controller();
$test3 = new View();

谢谢,你能看一下这个,让我知道它是怎么在这个例子中工作的吗?那是因为它要查找文件core/classes/。。。您需要添加../classes/或/classes;-)正如Marc所说,当您尝试实例化一个不存在的类时,将调用您注册到spl autoloader的函数。包含命名空间(如果存在)的类名将传递给已注册的自动加载函数。这意味着您必须使用传递的类名,自己计算文件+其位置+包含它。到现在为止,一直都还不错。在你在第一篇文章中分享的代码中,至少有一个错误。您尝试从不同的位置包含该文件三次。也没有文件存在检查。我建议再看看php.net->spl\u autoload\u regist