自动加载器适用于root用户的文件,但不适用于子文件夹中的文件

时间:2017-03-19 01:38:44

标签: php

我在一个名为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;
});

我的文件夹结构如下所示:

enter image description here

黑掉的文件夹是项目的名称。请注意,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在子文件夹中时,为什么自动加载器不工作?我希望它适用于项目根目录中的文件和子文件夹中的文件。

1 个答案:

答案 0 :(得分:0)

以下是我为此问题提出的解决方案:

  1. 在includes / config.php文件中,更新了自动加载器到PSR-4,请参见此处的闭包示例:https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md。匿名函数有一个名为$ base_dir的变量。
  2. 创建了一个名为root.php的文件,并将其存储在项目根目录中(与index.php相同的位置)。它包含以下内容:
  3. <?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;
    ?>

    1. 在includes / config.php中,定义ROOT常量如下:
    2. <?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
      ?>

      1. 在include / config.php中的自动加载器中,按如下方式设置$ base_dir:$base_dir = ROOT . 'classes/';

      2. 在js / functions.php中包含配置文件:require_once (__DIR__ . '/../includes/config.php');

      3. 现在自动加载器适用于存储在根目录中的index.php,以及存储在js子文件夹中的functions.php。