chrisharrison/php-array-of

实现指定类型的数组。PHP的泛型替代品。

1.1 2020-12-18 15:43 UTC

This package is auto-updated.

Last update: 2024-08-25 18:55:51 UTC


README

Build Status

实现指定类型的数组。PHP的泛型替代品。

要求

需要 PHP >= 7.1

安装

通过 Composer 显然

composer require chrisharrison/php-array-of

为什么?

PHP 7 对类型声明提供了很好的支持,包括参数和返回值。现在它也能处理基本类型以及类名。例如

public function dealCard(string $cardName): Card;

还有一件事仍然缺失。数组泛型。有一个关于实现 'Array Of' 的 RFC。它已经存在了一段时间,但遭到了广泛的拒绝。

这个库是对此的解决方案。它允许你对特定类型的数组进行类型声明。

使用方法

使用现有实现

该库提供了所有 PHP 原始类型的 ArrayOf 实现。例如。

  • ArrayOfInteger
  • ArrayOfFloat
  • ArrayOfString
  • ArrayOfBoolean

这些可以用于类型声明

public function getIntegers(): ArrayOfInteger;

可以创建一个 ArrayOfInteger

$integers = new ArrayOfInteger([1,1,2,3,5,8,13]);

并像数组一样使用

$sum = $integers[5] + $integers[6]; // equals 21

实现自己的类型

你可以为自己的类型创建自己的 ArrayOf

final class ArrayOfCard extends ArrayOf
{
    protected function typeToEnforce(): string
    {
        return Card::class;
    }
}

可以创建一个 ArrayOfCard

$aceOfSpades = new Card('spades', 'ace');
$threeOfClubs = new Card('clubs', '3');

$cards = new ArrayOfCard([$aceOfSpades, $threeOfClubs]);

其他注意事项

强制执行

ArrayOf 的成员将被强制执行为在 typeToEnforce 抽象方法中指定的类型。这种强制执行发生在运行时实例化时。如果你尝试使用不匹配类型的成员进行实例化,将会抛出异常。

允许的类型

只有 PHP 的 标量 和对象可以是 ArrayOf 的成员。因此没有 callable 和数组。

不可变性

ArrayOf 是可变的。这个库提供了定义不可变对象的能力,形式为 ImmutableArrayOf。这些对象从 ArrayOf 扩展而来,工作方式相同,只是在初始实例化之后,不能再对该对象进行任何更改。如果你尝试对该对象执行写操作(例如 unset),将会抛出异常。所有原始类型也都以不可变的形式提供

  • ImmutableArrayOfInteger
  • ImmutableArrayOfFloat
  • ImmutableArrayOfString
  • ImmutableArrayOfBoolean