adaddinsane/dataobject

具有排序、过滤和合并的数据对象存储和恢复

1.1.0 2024-10-02 19:04 UTC

This package is auto-updated.

Last update: 2024-10-02 19:08:09 UTC


README

此包提供了两个可扩展的类,通过各种默认和自定义方法访问数据数组的元素。

为什么要这样做?主要原因是简单地传递数组无法验证正在传递的内容,但将数组作为对象可以提供类型提示,从而提供更好的正确代码的确定性。

所有类都是抽象的(在以下示例中忽略),必须扩展才能使用。

选项

一个类允许写入数据,而另一个提供不可变对象,该对象没有 set() 方法。

$data = [
  'a' => 'A',
  'b' => 'B'
];

$object = new DataObject($data);

$a = $object->get('a');
$b = $object->get('b', 'z'); // Default value 'z', if 'b' key is not set.

$data->set('b', 'q');

$immutable = new ImmutableDataObject($data);

$immutable->set('b', 'q'); // Method not permitted.

此包可与ParamVerify包一起使用,该包可以在创建数据对象之前检查数组的内容。

如何使用

您可以直接使用这些类,但这不是最佳方式。

假设您以数组的形式从API获取数据,我们将其称为personData。要使用DataObject,您将创建一个新的类

class PersonData extends \Adaddinsane\DataObject\ImmutableDataObject {

    public function getFullName(): string {
        return $this->get('given_name') . ' ' . $this->get('family_name');
    }
}

您可以创建方法来提取所需的数据。

如果API数据结构发生变化,只需更改类以匹配。如果您在多个地方使用 getFullName(),只需更改一次。

现在您可以在参数中使用类型提示来确保您传递了正确的项目。

function analyse(PersonData $person) { ... }

GenericBag

这是一个第三抽象对象,它扩展了DataObject,允许添加的项被验证为特定类类型或类型。

验证函数也可以被覆盖,如果存储的不是类。

Bag的目的在于,您可以拥有一个可以一起传递的项集合,并且可以类型提示以确保传递了正确的项。

合并

在您的GenericBag类中,实现 GenericBagMergeInterface 类和 trait GenericBagMergeTrait;,然后您可以访问一个merge()方法,该方法接受另一个GenericBag对象作为参数。

过滤

在您的GenericBag类中,实现 GenericBagFilterInterface 类和 trait GenericBagFilterTrait;,然后您可以访问一个filter()方法,该方法接受一个过滤器可调用。

过滤器可调用用于在GenericBag的数据上执行 array_filter() 命令,以提取一个子集项,然后用于创建和返回一个具有相同类的新GenericBag。

排序

在您的GenericBag类中,实现 GenericBagSortInterface 类和 trait GenericBagSortTrait;,然后您可以访问一个sort()方法,该方法接受一个排序可调用。

排序可调用用于对GenericBag的数据执行 uasort() 命令,对GenericBag的项进行排序。不返回任何值。

其他访问形式

DataObjects还实现了ArrayIterator和Count接口,这意味着如果您愿意,您可以使用对象进行循环或计数值。