PHP中的泛型:初学者指南——为什么需要以及如何使用

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

PHP中泛型简介:是什么以及为什么需要



如果您刚开始学习PHP,或者已经使用PHP一段时间,那么您很可能遇到过这样的情况:函数或类需要处理不同的数据类型。例如,您创建了一个集合,它可以存储数字、字符串和对象。如果没有泛型(泛化类型),您要么需要为每种类型编写单独的类,要么使用混合类型(mixed),这会降低代码的安全性。



泛型是一种机制,它允许您创建能够处理不同数据类型,同时保持严格类型化的类、接口和函数。PHP从8.0版本开始支持泛型,并在PHP 8.1和8.2中得到了显著改进。在本文中,我们将讨论为什么需要它们,如何使用它们,以及它们带来的优势。



为什么需要在PHP中使用泛型?



缺少泛化类型的问题

假设您正在编写一个用于处理元素列表的类。没有泛型,您将不得不使用mixed类型,或者为每种数据类型编写单独的类:



<?php// 没有泛型——不安全class SimpleList {    private array $items = [];

public function add($item): void { $this->items[] = $item; }

public function get(int $index): mixed { return $this->items[$index] ?? null; }}

// 使用$list = new SimpleList();$list->add(42);$list->add('字符串'); // 不会报错,但逻辑被破坏了$value = $list->get(0); // 类型为 mixed —— IDE 不会提示这是 int?>


如您所见,这种方法会导致潜在的错误:您可能会意外地将字符串添加到预期只有数字的地方,而IDE无法警告您。



泛型的优势

  • 类型安全:编译器和IDE在编写代码时检查类型是否匹配。
  • 代码复用:一个类或函数可以处理任何数据类型。
  • 代码可读性:可以立即理解期望的类型。
  • 更少的错误:消除了意外的类型不匹配。


使用泛型,同一个列表类变得安全且通用:



<?php// 使用泛型——安全class GenericList {    private array $items = [];

public function add(T $item): void { $this->items[] = $item; }

public function get(int $index): ?T { return $this->items[$index] ?? null; }}

// 使用$intList = new GenericList();$intList->add(42);// $intList->add('字符串'); // 类型错误!

$stringList = new GenericList();$stringList->add('你好');$value = $stringList->get(0); // IDE 知道这是 string?>


如何在PHP中使用泛型



基本语法

PHP中的泛型使用尖括号<>和字母T(代表Type)声明——这是类型变量的通用名称。您可以使用任何名称,但T是标准。



类示例:

<?phpclass Container {    private T $value;

public function __construct(T $value) { $this->value = $value; }

public function getValue(): T { return $this->value; }}

$intContainer = new Container(100);$stringContainer = new Container('Hello');?>


类型约束

有时需要类型参数符合特定的接口或类。为此,可以使用约束(bounds):



<?phpinterface Printable {    public function print(): string;}

class Document implements Printable { public function print(): string { return '文档'; }

博客

书籍推荐