关于php:PHP-Composer-自动加载

38次阅读

共计 4522 个字符,预计需要花费 12 分钟才能阅读完成。

前言:这篇文章是从外国网站看到的,把 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 文件。

正文完
 0