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 应用和框架采用的标准做法。
挑战
简单让我们构建一个小型应用,使用 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() 结果
?>这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: PHP 在线编译器