如果您想按照示例进行操作,请确保在您的系统上安装 Composer。使用 Composer 自动加载时,您可以选择不同的方法。
具体来说,Composer 提供了四种不同的自动加载文件的方法:
- 文件自动加载
- 类图自动加载
- PSR-0 自动加载
- PSR-4 自动加载
根据 Composer 官方文档,PSR-4 是推荐的自动加载方式,我们将在下一节详细介绍。在本节中,我们将简要讨论其他三个选项。
在我们继续之前,让我们快速浏览一下当您想使用 Composer 自动加载时需要执行的步骤。
- 在项目或库的根目录中定义composer.json文件。它应该包含基于自动加载类型的指令。
- 运行该
composer dump-autoload
命令以生成 Composer 将用于自动加载的必要文件。 require 'vendor/autoload.php'
在文件顶部包含要使用自动加载的语句。
自动加载:file指令
文件自动加载的工作方式类似于允许您加载整个源文件的include
或require
语句。files
每次应用程序运行时,都会加载该指令引用的所有源文件。这对于加载不使用类的源文件很有用。
要使用文件自动加载,请files
在composer.json文件的指令中提供文件列表,如以下代码段所示。
{
"autoload": {
"files": ["lib/Foo.php", "lib/Bar.php"]
}
}
我们可以在files
要使用 Composer 自动加载的指令中提供文件列表。使用上述内容在项目根目录中创建composer.json文件后,您只需运行该composer dump-autoload
命令即可创建必要的自动加载器文件。这些将在供应商目录下创建。最后,您需要require 'vendor/autoload.php'
在文件顶部包含要使用 Composer 自动加载文件的语句,如以下代码段所示。
<?php
require 'vendor/autoload.php';
?>
该require 'vendor/autoload.php'
语句确保动态加载必要的文件。
自动加载:classmap指令
Classmap 自动加载是文件自动加载的改进版本。您只需要提供一个目录列表,Composer 将扫描这些目录中的所有文件。对于每个文件,Composer 将列出该文件中包含的类,并且每当需要这些类中的一个时,Composer 将自动加载相应的文件。
让我们快速修改composer.json文件来演示类映射自动加载器。
{
"autoload": {
"classmap": ["lib"]
}
}
运行该composer dump-autoload
命令,Composer 将读取lib目录中的文件以创建可自动加载的类映射。
自动加载:PRS-0
PSR-0 是 PHP-FIG 组推荐的自动加载标准。在 PSR-0 标准中,您必须使用命名空间来定义您的库。完全限定的类名必须反映\<Vendor Name>\(<Namespace>\)*<Class Name>
结构。此外,您的类必须保存在遵循与命名空间相同的目录结构的文件中。
让我们看看下面的composer.json
文件。
{
"autoload": {
"psr-0": {
"Tutsplus\\Library": "src"
}
}
}
在 PSR-0 自动加载中,您需要将命名空间映射到目录。在上面的例子中,我们告诉 Composer 任何以Tutsplus\Library
命名空间开头的东西都应该在src\Tutsplus\Library目录中可用。
例如,如果要Foo
在src\Tutsplus\Library目录中定义类,则需要创建src\Tutsplus\Library\Foo.php 文件,如以下代码段所示:
<?php
namespace Tutsplus\Library;
class Foo
{
}
?>
这个类是在Tutsplus\Library
命名空间中定义的。此外,文件名对应于类名。让我们快速看看如何自动加载Foo
类。
<?php
require 'vendor/autoload.php';
$objFoo = new Tutsplus\Library\Foo();
?>
Composer 将从src\Tutsplus\Library目录自动加载Foo
类。
以上是对 Composer 中文件、类映射和 PSR-0 自动加载的简要说明。在下一节中,我们将看到 PSR-4 自动加载是如何工作的。
自动加载:PRS-4
在上一节中,我们讨论了 PSR-0 自动加载的工作原理。PSR-4 类似于 PSR-0 自动加载,因为您需要使用名称空间,但您不需要使用名称空间模仿目录结构。
在 PSR-0 自动加载中,您必须将命名空间映射到目录结构。正如我们在上一节中讨论的,如果您想自动加载Tutsplus\Library\Foo
类,它必须位于src\Tutsplus\Library\Foo.php。在 PSR-4 自动加载中,您可以缩短目录结构,与 PSR-0 自动加载相比,这会导致目录结构更加简单。
我们将修改上面的示例 – 看看您是否能发现差异。
这是使用 PSR-4 自动加载的 composer.json文件的外观。
{
"autoload": {
"psr-4": {
"Tutsplus\\Library\\": "src"
}
}
}
需要注意的是,我们在命名空间的末尾添加了尾随反斜杠。上面的映射告诉 Composer 任何以Tutsplus\Library
命名空间开头的东西都应该在src目录中可用。所以你不需要创建Tutsplus和Library目录。例如,如果您请求Tutsplus\Library\Foo
该类,Composer 将尝试加载src\Foo.php文件。
重要的是要了解Foo
该类仍然定义在Tutsplus\Library
命名空间下;只是您不需要创建模仿命名空间的目录。该SRC \ Foo.php文件的内容将是相同的那些的 SRC \ Tutsplus \图书馆\ Foo.php的文件 一节。
如您所见,PSR-4 导致目录结构更加简单,因为您可以省略创建嵌套目录,同时仍然使用完整的命名空间。
PSR-4 是推荐的自动加载方式,它被 PHP 社区广泛接受。如果您还没有这样做,您应该开始在您的应用程序中使用它!
[
本帖最后由 xiexie 于 2023-2-6 09:41 编辑 ]