自动加载文件

每个应用都在不同的位置包含有大量的类文件。框架提供了实现核心功能的类,而你的应用将会由大量的库,模型,以及其他实体文件以运行。 你也可能需要第三方的类库以供项目使用。记录每个单独的文件的位置,并硬编码一系列的 requires() 在文件中,这是一个非常头疼且容易出错的事情。 这就是自动加载器的用武之地。

CodeIgniter提供了一个非常灵活且需要极少配置的自动加载器。它可以定位单个的非命名空间标注的类,符合命名空间规范 PSR4 目录加载结构的类, 甚至可以在常规目录下定位类文件(例如控制器,模型等)。

为了提升性能,CodeIgniter的核心组件已被添加到类映射文件中。

自动加载器可以单独运行,如果你需要的话,可以和其他自动加载器协同运行,例如 Composer 或者是你自己的自定义加载器。 因为它们都是通过 spl_autoload_register 来注册运行的,所以可以依次运行,互不打扰。

自动加载器总是处于激活状态,并通过 spl_autoload_register() 在框架运行开始时进行注册挂载。

配置

初始配置是在 /application/Config/Autoload.php 文件中进行。该文件包含两个主要的数组,一个用于类映射图,一个用于符合PSR-4规范的命名空间。

命名空间

我们推荐通过在应用文件里创建一个或多个命名空间来管理你的类。而这一点对于业务逻辑相关联的类,实体类等也是最为重要的。 配置文件中的 psr4 数组允许你将命名空间和对应的类所存在的目录进行映射:

$psr4 = [
        'App'         => APPPATH,
        'CodeIgniter' => SYSTEMPATH,
];

数组的每一行的键就是命名空间本身,不需要反斜杠()。如果你需要在定义数组时使用双引号,确保使用反斜杠进行转义。 这意味着应当如同 My\\App 而不是 My\App 这样。对应的值就是这些类所存在的目录,而这些需要包括反斜杠。

默认来说,应用文件夹对应着 App 命名空间。尽管你不一定非得给应用目录下的控制器,库和模型声明命名空间,但是如果你这样做了的话, 这些文件就会在 App 命名空间下被找到。你可以通过编辑 /application/Config/Constants.php 文件来改变这个命名空间,并且通过更改 APP_NAMESPACE 选项来设置新的命名空间值:

define('APP_NAMESPACE', 'App');

你需要修改所有现存的指向当前命名空间的文件。

重要

配置文件的命名空间是 Config ,而不是如你所想的 App\Config。这一特性使得核心系统文件可被准确定位,甚至在应用的命名空间被更改的情况下。

类映射图

类映射图是CodeIgniter用来榨干系统最后一分性能的手段,通过不使用额外的 file_exists() 调用来查询文件系统来实现。 你可以利用类映射图来链接到第三方库,即使它们并没有命名空间:

$classmap = [
        'Markdown' => APPPATH .'third_party/markdown.php'
];

每一行的键就是你所需要定位的类名。值就是需要定位的路径

支持从前版本

如果以上的所有方法都找不到对应的类文件,且这个类没有对应的命名空间,自动加载器将会查找 /application/Libraries/application/Models 目录来尝试定位文件。 这为从以前版本升级提供了一个简洁的方式。

对于支持从前版本而言,没有额外的配置选项。

支持Composer

默认情况下CodeIgniter自动初始化支持Composer. 默认情况下,它将在 ROOTPATH.'vendor / autoload.php' 中查找Composer的自动加载文件。 如果因为一些原因需要更改这个文件的位置,你可以修改定义在 Config\Constants.php 的值

注解

如果在CodeIgniter和Composer中都定义了相同的名称空间,则CodeIgniter的自动加载器将首先定位文件。