我在一个名为config.php的文件中有一个自动加载器,如下所示:
spl_autoload_register(function($className) {
$className = ltrim($className, '\\');
$fileName = '';
$namespace = '';
if ($lastNsPos = strrpos($className, '\\')) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
require $fileName;
});
我的文件夹结构如下所示:
黑掉的文件夹是项目的名称。请注意,config.php位于“includes”子文件夹中。它通过在脚本中包含行require_once ('includes/config.php');
来自动加载适用于index.php的类。创建了一个新文件functions.php来处理与数据库的AJAX请求通信。自动加载器适用于此文件,只要它在项目根目录中,并且require_once ('includes/config.php');
包含在脚本中。但是,当functions.php移动到子文件夹(例如js子文件夹)并且脚本中包含require_once ('../includes/config.php');
时,自动加载器不起作用。显示的错误消息是警告:require(classes \ model \ Operation.php):无法打开流:C:\ xampp \ htdocs \ xxxxx \ OOP \ includes \ config.php中没有此类文件或目录74 即可。当functions.php在子文件夹中时,为什么自动加载器不工作?我希望它适用于项目根目录中的文件和子文件夹中的文件。
答案 0 :(得分:0)
以下是我为此问题提出的解决方案:
<?php
# capture project's root directory
// config.php, which is stored in a subfolder, requires this file so it knows this information
// purpose of concatenating DIRECTORY_SEPARATOR is to add a slash to end of path
$root = __DIR__ . DIRECTORY_SEPARATOR;
?>
<?php
require (__DIR__ . '/../root.php'); // get project's root directory from file stored in root - this is needed to have access to the $root variable to create the ROOT constant in this script
define ('ROOT', $root); // this constant is used when in a file stored in a subfolder requires files stored in other subfolders
?>
在include / config.php中的自动加载器中,按如下方式设置$ base_dir:$base_dir = ROOT . 'classes/';
。
在js / functions.php中包含配置文件:require_once (__DIR__ . '/../includes/config.php');
现在自动加载器适用于存储在根目录中的index.php,以及存储在js子文件夹中的functions.php。