发新话题
打印

自动加载如何与 Composer 配合使用

自动加载如何与 Composer 配合使用

如果您想按照示例进行操作,请确保在您的系统上安装 Composer。使用 Composer 自动加载时,您可以选择不同的方法。

具体来说,Composer 提供了四种不同的自动加载文件的方法:

  1. 文件自动加载
  2. 类图自动加载
  3. PSR-0 自动加载
  4. PSR-4 自动加载

根据 Composer 官方文档,PSR-4 是推荐的自动加载方式,我们将在下一节详细介绍。在本节中,我们将简要讨论其他三个选项。

在我们继续之前,让我们快速浏览一下当您想使用 Composer 自动加载时需要执行的步骤。

  • 在项目或库的根目录中定义composer.json文件。它应该包含基于自动加载类型的指令。
  • 运行该composer dump-autoload命令以生成 Composer 将用于自动加载的必要文件。
  • require 'vendor/autoload.php'在文件顶部包含要使用自动加载的语句。
自动加载:file指令

文件自动加载的工作方式类似于允许您加载整个源文件的includerequire语句。files每次应用程序运行时,都会加载该指令引用的所有源文件。这对于加载不使用类的源文件很有用。

要使用文件自动加载,请filescomposer.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';
  
// code which uses things declared in the "lib/Foo.php" or "lib/Bar.php" file
?>
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目录中可用。

例如,如果要Foosrc\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目录中可用。所以你不需要创建TutsplusLibrary目录。例如,如果您请求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 编辑 ]

TOP

发新话题