cunningsoft / generic-list
此库提供了创建自定义迭代器所需的工具,而无需重复所有样板代码。
0.1.1
2020-03-06 18:46 UTC
Requires
- php: ^7.3
Requires (Dev)
- doctrine/coding-standard: ^6.0
- infection/infection: ^0.14.0
- phpstan/phpstan-phpunit: ^0.11
- phpstan/phpstan-shim: ^0.11
- phpstan/phpstan-strict-rules: ^0.11
- phpunit/phpunit: ^8.3
This package is auto-updated.
Last update: 2024-09-07 04:38:57 UTC
README
此库提供了创建自定义迭代器所需的工具,而无需重复所有样板代码。
安装
通过 composer 安装此库
php composer.phar require cunningsoft/generic-list
用法
未排序列表
创建自定义列表类(例如,用于用户)
<?php declare(strict_types=1); namespace MyApp; use ArrayIterator; use Cunningsoft\GenericList\ListConstructor; use Cunningsoft\GenericList\ListType; final class UserList implements ListType { use UnsortedListConstructor; public function getIterator(): ArrayIterator { return $this->list->getIterator(); } protected function getElementType(): string { return User::class; } }
通过将方法调用传递到通用列表中添加常用功能
public function isEmpty(): self { return $this->list->isEmpty(); }
添加功能以满足特定需求来定制列表
public function filterOnlyActive(): self { return new self($this->list->filter(static function (User $user): bool { return $user->isActive(); }); }
现在您可以像这样使用它
$users = new UserList([$userA, $userB, $userC]); if ($users->filterOnlyActive()->isEmpty()) { echo 'No active users!'; }
排序列表
排序列表的工作方式与未排序列表相同,但它们使用 SortedListConstructor
特性,因此您必须提供一个排序函数。
<?php declare(strict_types=1); namespace MyApp; use ArrayIterator; use Cunningsoft\GenericList\ListConstructor; use Cunningsoft\GenericList\ListType; final class SortedByAgeUserList implements ListType { use SortedListConstructor; public function getIterator(): ArrayIterator { return $this->list->getIterator(); } protected function getElementType(): string { return User::class; } protected function getSortFunction(): callable { return static function (User $userA, User $userB): int { return $userA->getAge() <=> $userB->getAge(); }; } }
现在您可以使用此类,就像上述未排序列表中描述的那样,但通过传递此类对象,您可以确保它始终处于预期的有序状态。
常见问题解答
问题:为什么不简单地使用数组?
答案:您将获得类型安全,并且可以为每个列表分配自定义行为。
问题:为什么不简单地扩展 GenericList
、UnsortedGenericList
或 SortedGenericList
?
答案:这将创建一个庞大的继承树,没有任何实际的好处。这种方式,对于每个列表,公开的行为正是每个用例所需的。
联系方式
GitHub:https://github.com/dmecke
Twitter:@danielmecke