此bar/php-array-of

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

v1.1 2020-12-15 18:11 UTC

This package is not auto-updated.

Last update: 2024-10-03 10:18:46 UTC


README

Build Status

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

需求

需要PHP 7.1

安装

通过Composer,当然是了

composer require chrisharrison/php-array-of

为什么?

PHP 7 对类型声明有很好的支持,无论是在参数还是在返回值中。现在它还处理原始类型以及类名。例如

public function dealCard(string $cardName): Card;

仍然缺少一点。数组泛型。有一个RFC用于实现 'Array Of'。它已经存在很长时间了,并被普遍拒绝。

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

用法

使用现有实现

库提供了所有PHP标量类型的ArrayOf实现。即

  • ArrayOfInteger
  • ArrayOfFloat
  • ArrayOfString
  • ArrayOfBoolean

这些可以在类型声明中使用

public function getIntegers() : ArrayOfInteger;

可以创建一个ArrayOfInteger

$integers = 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 = ArrayOfCard([$aceOfSpades, $threeOfClubs]);

其他关注点

强制执行

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

允许的类型

只有PHP 标量和对象可以是ArrayOf的成员。所以没有callable和没有array

不可变性

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

  • ImmutableArrayOfInteger
  • ImmutableArrayOfFloat
  • ImmutableArrayOfString
  • ImmutableArrayOfBoolean