Menu
CoddyTech

Composer 自动加载器

本课属于 Coddy PHP 学习旅程的“面向对象编程”单元。第 13 课,共 91 课。

自己编写自动加载器是可行的,但实际的 PHP 项目会使用 Composer 自动处理自动加载。Composer 会读取项目的配置,并生成符合 PSR-4 标准的优化自动加载器。

配置位于项目根目录下的 composer.json 文件中。下面介绍如何定义自动加载规则:

{
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}

这会告诉 Composer,任何以 App\ 开头的类都应从 src/ 目录加载。完成此设置后,Composer 会在 vendor/ 目录中生成自动加载器文件。

要使用 Composer 的自动加载器,你只需在入口文件顶部添加一行代码:

<?php
require 'vendor/autoload.php';

use App\Models\User;
use App\Services\Logger;

$user = new User("Alice");
$logger = new Logger();

这一条 require 语句就能处理整个项目的所有类加载。如果需要,你可以定义多个命名空间映射:

{
    "autoload": {
        "psr-4": {
            "App\\": "src/",
            "Tests\\": "tests/"
        }
    }
}

要点:Composer 的自动加载器省去了手动引入文件,并确保项目中的类始终以一致的方式加载。这是几乎所有现代 PHP 应用和框架采用的标准做法。

challenge icon

挑战

简单

让我们构建一个小型应用,使用 Composer 的自动加载方式来组织分布在多个文件中的类。你将模拟真实 PHP 项目如何通过 PSR-4 命名空间和集中式自动加载器来组织代码。

你将创建 4 个协同工作的文件:

  • src/Models/Product.php:在 App\Models 命名空间中定义一个 Product 类。它应包含 public $name 和 public $price 属性、一个接收并设置这两个值的构造函数,以及一个返回 "[name]: $[price]" 的 getInfo() 方法。
  • src/Models/Customer.php:在 App\Models 命名空间中定义一个 Customer 类。它应包含一个 public $name 属性、一个接收并设置姓名的构造函数,以及一个返回 "Welcome, [name]!" 的 greet() 方法。
  • vendor/autoload.php:使用 spl_autoload_register 创建一个简单的自动加载器,模拟 Composer 的行为。它应将 App\ 命名空间前缀映射到 src/ 目录,将命名空间分隔符转换为目录分隔符,并在末尾添加 .php,以加载正确的文件。
  • index.php:这是你的入口文件。用一行代码引入 vendor/autoload.php 中的自动加载器,然后使用 use 关键字导入 App\Models\Product 和 App\Models\Customer。创建一个名称为 "Laptop"、价格为 999 的 Product,以及一个名称为 "Alice" 的 Customer。打印对客户调用 greet() 的结果,以及对产品调用 getInfo() 的结果(各占一行)。

这里的关键概念是,你的 index.php 只需要一条 require 语句来加载自动加载器。此后,使用类时,它们都会自动加载。这正是现代 PHP 框架和应用使用 Composer 的方式。

亲手试试

<?php
// TODO: 从 vendor/autoload.php 引入自动加载器

// TODO: 使用 'use' 关键字导入 App\Models\Product

// TODO: 使用 'use' 关键字导入 App\Models\Customer

// TODO: 创建一个 Product,名称为 "Laptop",价格为 999

// TODO: 创建一个 Customer,名称为 "Alice"

// TODO: 输出 Customer 的 greet() 结果

// TODO: 输出 Product 的 getInfo() 结果
?>
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: PHP 在线编译器