PHP Composer 自动加载

唔系我认叻

前言:这篇文章是从外国网站看到的,把composer写得很贴地,翻译回来记录下。

简介:在本教程中,您将学习如何使用 Composer 从使用 PSR-4 标准的文件自动加载 PHP 类。

使用 require_once 构造加载类
首先,使用文件创建以下目录结构:

.
├── app
│ ├── bootstrap.php
│ └── models
│ └── User.php
└── index.php
代码语言: PHP (php )
在User.php该文件models夹包含的User 类:

class User
{
  private $username;

  private $password;

  public function __construct($username, $password)
  {
      $this->username = $username;
      $this->password = password_hash($password);
  }

  public function getUsername(): string
  {
      return $this->username;
  }
}

代码语言: PHP (php )
这User是一个简单的类。它有两个属性$username和$password。该构造函数初始化从它的参数属性。此外,它使用该password_hash()函数对$password.

该bootstrap.php文件使用require_once构造User从User.php文件models夹中的文件加载类:

<?php

require_once 'models/User.php';

代码语言: PHP (php )
当models文件夹中有更多类时,您可以require_once向bootstrap.php文件中添加更多语句以加载这些类。

该index.php文件加载bootstrap.php文件并使用User该类:

<?php

    require './app/bootstrap.php';

    $user = new User('admin', '$ecurePa$$w0rd1');

代码语言: PHP (php )
如果您有少量类,则此应用程序结构很有效。然而,当应用程序有大量的类时,require_once就不能很好地扩展。在这种情况下,您可以使用该spl_autoload_register()函数从文件中自动加载类。

该spl_autoload_register()功能的问题在于您必须自己实现自动加载器功能。而且您的自动加载器可能不喜欢其他开发人员开发的自动加载器。

因此,当您使用不同的代码库时,您需要研究该特定代码库中的自动加载器以了解它们的工作原理。

这就是 Composer 发挥作用的原因。

作曲家简介
Composer是 PHP 的依赖管理器。Composer 允许您管理 PHP 项目中的依赖项。在本教程中,我们将重点介绍如何使用 Composer 自动加载类。

在使用 Composer 之前,您需要下载并安装它。官方文档为您提供了如何在您的计算机上下载和安装 Composer的详细步骤。

要检查 Composer 是否安装成功,请从 Windows 上的命令提示符或 macOS 和 Linux 上的终端运行以下命令:

composer -v
代码语言: PHP (php )
它将返回当前版本以及您可以与composer命令一起使用的许多选项。

使用 Composer 自动加载类
回到前面的示例,要使用 Composer,首先要composer.json在项目的根文件夹下创建一个名为的新文件。项目目录将如下所示:

.
├── app
│ ├── bootstrap.php
│ └── models
│ └── User.php
├── composer.json
└── index.php
代码语言: PHP (php )
在 中composer.json,添加以下代码:

{
        "autoload": {
        "classmap": ["app/models"]
        }
}

代码语言: PHP (php )
此代码意味着 Composer 将自动加载定义该app/models文件夹的所有类文件。

如果您要加载来自其他文件夹的类,您可以在classmap数组中指定它们:

{
    "autoload": {
        "classmap": ["app/models", "app/services"]
    }
}

代码语言: PHP (php )
在这个例子中,Composer 将从文件夹下的文件夹models和services文件夹中加载类app。

接下来,在 Windows 上启动命令提示符或在 macOS 和 Linux 上启动终端,然后导航到项目目录。

然后,从项目目录中键入以下命令:

composer dump-autoload
代码语言: PHP (php )
Composer 将生成一个名为的目录vendor,其中包含许多如下文件:

.
├── app
│ ├── bootstrap.php
│ └── models
│ └── User.php
├── composer.json
├── index.php
└── vendor

  ├── autoload.php
  └── composer
      ├── autoload_classmap.php
      ├── autoload_namespaces.php
      ├── autoload_psr4.php
      ├── autoload_real.php
      ├── autoload_static.php
      ├── ClassLoader.php
      └── LICENSE

代码语言: PHP (php )
现在对您来说最重要的文件是autoload.php文件。

之后,使用构造autoload.php将bootstrap.php文件加载到文件中require_once:

<?php

    require_once __DIR__ . '/../vendor/autoload.php';

代码语言: PHP (php )
最后,您可以User在以下位置使用该类index.php:

<?php

    require './app/bootstrap.php';

    $user = new User('admin', '$ecurePa$$w0rd1');

代码语言: PHP (php )
从现在开始,只要models目录中有新类,就需要composer dump-autoload再次运行该命令以重新生成autoload.php文件。

例如,下面定义了一个Comment在Comment.php文件models夹下的文件中调用的新类:

  <?php

class Comment
{
    private $comment;

    public function __construct(string $comment)
    {
        $this->comment = $comment;
    }

    public function getComment(): string
    {
        return strip_tags($this->comment);
    }
}

代码语言: PHP (php )
如果不运行composer dump-autoload命令并使用文件中的Comment类index.php,则会出现错误:

<?php

    require './app/bootstrap.php';

    $user = new User('admin', '$ecurePa$$w0rd1');

    $comment = new Comment('<h1>Hello</h1>');
    echo $comment->getComment();

代码语言: PHP (php )
错误:

Fatal error: Uncaught Error: Class 'Comment' not found in...

代码语言: PHP (php )
但是,如果您composer dump-autoload再次运行该命令,该index.php文件将正常工作。

使用 PSR-4 自动加载 Composer
PSR 代表 PHP 标准推荐。PSR 是 PHP Framework Interop Group 或 PHP-FIG 发布的 PHP 规范。

PSR 的目标是实现 PHP 组件的互操作性,并为 PHP 编程中最佳实践的实现提供通用的技术基础。

PHP-FIG 从 PSR-0 开始发布了很多 PSR。有关 PSR 的完整列表,请查看 PSR 页面。

PSR-4 是自动加载标准,描述了从文件路径自动加载类的规范。https://www.php-fig.org/psr/p...

根据 PSR-4,完全限定的类名具有以下结构:

\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
代码语言: PHP (php )
该结构以一个命名空间开始,然后是一个或多个子命名空间,以及类名。

为了符合 PSR-4,您需要像这样构建以前的应用程序:

.
├── app
│ ├── Acme
│ │ ├── Auth
│ │ │ └── User.php
│ │ └── Blog
│ │ └── Comment.php
│ └── bootstrap.php
├── composer.json
└── index.php
代码语言: PHP (php )
新结构有以下变化:

首先,models删除目录。

二User.php是在Acme/Auth文件夹下。并且User该类的命名空间为Acme/Auth. 注意命名空间如何映射到目录结构。这也有助于您通过查看其命名空间更快地找到类文件。

<?php

namespace Acme\Auth;

class User
{
    // implementation
    // ...
}

代码语言: PHP (php )
第三,Comment.php在Acme/Blog文件夹下。该Comment班有命名空间Acme\Blog:

<?php

namespace Acme\Blog;

class Comment
{
    // implementation
    // ...
}

代码语言: PHP (php )
四、composer.json文件如下所示:

{
    "autoload": {
        "psr-4": {
            "Acme\\":"app/Acme"
        }
    }
}

代码语言: PHP (php )
而不是使用classmap,该composer.json文件现在使用psr-4。该psr-4映射名称空间"Acme\"的"app/Acme"文件夹中。

请注意,命名空间中的第二个反斜杠 ( )Acme\用于转义第一个反斜杠 ( )。

五、要使用文件中的User和Comment类index.php,需要运行composer dump-autoload命令生成autoload.php文件:

composer dump-autoload
代码语言: PHP (php )
由于User和Comment类具有命名空间,因此您需要具有如下use语句index.php:

<?php

require './app/bootstrap.php';

use Acme\Auth\User as User;
use Acme\Blog\Comment as Comment;

$user = new User('admin', '$ecurePa$$w0rd1');

$comment = new Comment('<h1>Hello</h1>');
echo $comment->getComment();

代码语言: PHP (php )
概括
Composer 是 PHP 中的一个依赖管理工具。
使用 PSR-4 来组织目录和类文件。
使用composer dump-autoload命令生成autoload.php文件。

阅读 276
1 声望
0 粉丝
0 条评论
1 声望
0 粉丝
文章目录
宣传栏