cunningsoft/generic-list

此库提供了创建自定义迭代器所需的工具,而无需重复所有样板代码。

0.1.1 2020-03-06 18:46 UTC

This package is auto-updated.

Last update: 2024-09-07 04:38:57 UTC


README

此库提供了创建自定义迭代器所需的工具,而无需重复所有样板代码。

Minimum PHP version: 7.2.9 Build Status Code Coverage Scrutinizer Code Quality

安装

通过 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();
        };
    }
}

现在您可以使用此类,就像上述未排序列表中描述的那样,但通过传递此类对象,您可以确保它始终处于预期的有序状态。

常见问题解答

问题:为什么不简单地使用数组?

答案:您将获得类型安全,并且可以为每个列表分配自定义行为。

问题:为什么不简单地扩展 GenericListUnsortedGenericListSortedGenericList

答案:这将创建一个庞大的继承树,没有任何实际的好处。这种方式,对于每个列表,公开的行为正是每个用例所需的。

联系方式

GitHub:https://github.com/dmecke

Twitter:@danielmecke