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 在评论中提到的那样),自动加载器是在当前工作目录的上下文中调用的,调用该自动加载器的文件位于该目录中。
所以我做了一些改变。
- 制作了一个常量
APPROOT
,其中包含 link 到 app
文件夹(所有核心文件的根文件夹)
define('APPROOT', dirname(dirname(__FILE__)));
在我的例子中,APPROOT 是 C:\xampp\htdocs\mvc\app
- 使用该常量通过自动加载器获取正确的目录:
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
没有任何错误。
所以我是第一次学习 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 在评论中提到的那样),自动加载器是在当前工作目录的上下文中调用的,调用该自动加载器的文件位于该目录中。
所以我做了一些改变。
- 制作了一个常量
APPROOT
,其中包含 link 到app
文件夹(所有核心文件的根文件夹)
define('APPROOT', dirname(dirname(__FILE__)));
在我的例子中,APPROOT 是 C:\xampp\htdocs\mvc\app
- 使用该常量通过自动加载器获取正确的目录:
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
没有任何错误。