chrisharrison / php-array-of
实现指定类型的数组。PHP的泛型替代品。
1.1
2020-12-18 15:43 UTC
Requires
- php: ^7.1 || ^8.0
Requires (Dev)
- phpunit/phpunit: ^6.3 || ^9.3
- squizlabs/php_codesniffer: ^3.1
This package is auto-updated.
Last update: 2024-08-25 18:55:51 UTC
README
实现指定类型的数组。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