此bar / php-array-of
实现定义类型数组。PHP的泛型替代品。
v1.1
2020-12-15 18:11 UTC
Requires
- php: ^7.1 || ~8.0
Requires (Dev)
- phpunit/phpunit: ^6.3
- squizlabs/php_codesniffer: ^3.1
This package is not auto-updated.
Last update: 2024-10-03 10:18:46 UTC
README
实现定义类型数组。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