PHP 自动加载器找不到必要的 class

PHP autoloader cant find necessary class

所以我是第一次学习 PHP MVC,我想出了一个术语——自动加载所有需要的 .php 文件。

所以我在网上搜索了一些示例,并使用 spl_autoload_register 方法制作了一个自动加载文件,调用匿名方法来 require_once 所有需要的文件。不知道怎么回事,好像不行。

所以我做的spl_autoload_register方法是:

    spl_autoload_register(function($className){
        if(is_file('libraries/' . $className . '.php')){
            echo 'libraries/' . $className . '.php';
            require_once 'libraries/'. $className . '.php';
        }
    });

项目中的文件结构可在此处获得:https://prnt.sc/gPaVkLZRsPpj

如果我注释掉 spl_autoload_register 方法并一一要求所有必要的文件,它工作得很好。

    require_once 'libraries/Core.php';
    require_once 'libraries/Controller.php';
    require_once 'libraries/Database.php';

我试图在其中执行自动加载的文件如下所示:

<?php
    require_once '../app/autoload.php';

    // Init Core.php 
    $init = new Core();
    

我收到的错误信息是:

Fatal error: Uncaught Error: Class "Core" not found in C:\xampp\htdocs\farkops-mvc\public\index.php:5 Stack trace: #0 {main} thrown in C:\xampp\htdocs\farkops-mvc\public\index.php on line 5

我在网上搜索过,尝试过 spl_autoload_register 的其他实现方式,但都不起作用。

有人可以帮我解决这个问题吗? :)

所以问题是(正如@Lawrence Cherone 在评论中提到的那样),自动加载器是在当前工作目录的上下文中调用的,调用该自动加载器的文件位于该目录中。

所以我做了一些改变。

  1. 制作了一个常量 APPROOT,其中包含 link 到 app 文件夹(所有核心文件的根文件夹)
define('APPROOT', dirname(dirname(__FILE__)));

在我的例子中,APPROOT 是 C:\xampp\htdocs\mvc\app

  1. 使用该常量通过自动加载器获取正确的目录:
spl_autoload_register(function($className){
        if(is_file(APPROOT . '/libraries/' . $className . '.php')){
            require_once APPROOT . '/libraries/' . $className . '.php';
        }
    });

现在,自动加载器可以访问文件夹中的文件管理器,例如 C:\xampp\htdocs\mvc\app\libraries\Core.php 没有任何错误。