自动加载文件

每个应用程序都包含大量位于不同位置的类。框架提供了核心功能的类。您的应用程序将拥有许多库、模型和其他实体来使其正常工作。您可能还拥有项目正在使用的第三方类。跟踪每个文件的具体位置,并在文件中使用一系列 requires() 对其进行硬编码是一件非常头疼且容易出错的事情。这就是自动加载器发挥作用的地方。

CodeIgniter4 自动加载器

CodeIgniter 提供了一个非常灵活的自动加载器,它几乎不需要配置即可使用。它可以定位符合 PSR-4 自动加载目录结构的单个命名空间类。

自动加载器本身运行良好,但也可以与其他自动加载器一起使用,例如 Composer,甚至您自己的自定义自动加载器(如果需要)。由于它们都是通过 spl_autoload_register 注册的,因此它们按顺序工作,不会相互干扰。

自动加载器始终处于活动状态,在框架执行开始时使用 spl_autoload_register() 注册。

重要

您应该始终注意文件名的大小写。许多开发人员在 Windows 或 macOS 上的区分大小写的文件系统上进行开发。但是,大多数服务器环境使用区分大小写的文件系统。如果文件名大小写不正确,自动加载器将无法在服务器上找到该文件。

配置

初始配置在 app/Config/Autoload.php 中完成。该文件包含两个主要数组:一个用于类映射,另一个用于 PSR-4 兼容的命名空间。

命名空间

组织类文件的推荐方法是为应用程序文件创建一个或多个命名空间。这对于任何与业务逻辑相关的类、实体类等最为重要。配置文件中的 $psr4 数组允许您将命名空间映射到可以找到这些类的目录。

<?php

namespace Config;

use CodeIgniter\Config\AutoloadConfig;

class Autoload extends AutoloadConfig
{
    // ...
    public $psr4 = [
        APP_NAMESPACE => APPPATH, // For custom app namespace
        'Config'      => APPPATH . 'Config',
    ];

    // ...
}

每行的键是命名空间本身。这不需要尾随反斜杠。值是找到类的目录的位置。

确认命名空间

您可以通过 spark namespaces 命令检查命名空间配置。

php spark namespaces

应用程序命名空间

默认情况下,应用程序目录命名空间为 App 命名空间。您必须在应用程序目录中为控制器、库或模型命名空间,它们将在 App 命名空间下找到。

您可以通过编辑 **app/Config/Constants.php** 文件并在 APP_NAMESPACE 设置下设置新的命名空间值来更改此命名空间。

defined('APP_NAMESPACE') || define('APP_NAMESPACE', 'App');

您需要修改任何引用当前命名空间的现有文件。

重要

配置文件在 Config 命名空间中命名空间,而不是像您预期的那样在 App\Config 中。这允许核心系统文件始终能够找到它们,即使应用程序命名空间已更改。

类映射

类映射被 CodeIgniter 广泛使用,以通过避免使用额外的 is_file() 调用来访问文件系统,从而从系统中榨取最后一点性能。您可以使用类映射链接到未命名空间的第三方库。

<?php

namespace Config;

use CodeIgniter\Config\AutoloadConfig;

class Autoload extends AutoloadConfig
{
    // ...
    public $classmap = [
        'Markdown' => APPPATH . 'ThirdParty/markdown.php',
    ];

    // ...
}

每行的键是您要查找的类的名称。值是查找它的路径。

Composer 支持

Composer 支持默认情况下自动初始化。默认情况下,它在 ROOTPATH . 'vendor/autoload.php' 中查找 Composer 的自动加载文件。如果您需要出于任何原因更改该文件的路径,您可以修改在 **app/Config/Constants.php** 中定义的值。

注意

如果 CodeIgniter 和 Composer 中定义了相同的命名空间,CodeIgniter 的自动加载器将是第一个有机会找到该文件的人。