php immutable collections
versions
一个为 PHP 提供一组简约、类型化和管道式不可变集合的库。
PHP > 7.2
composer require dcsg/php-immutable-collectionsPHP 中缺少泛型,因此不允许在 PHP 中使用类型化集合。
该库提供了两个抽象的不可变集合:
由于 PHP 不像 Java 那样具有泛型,因此不可能有本机类型集合。该库中提供的集合是您创建自己的类型化集合的基础,您只需扩展它们即可。
DDD 就是让您的代码使用业务语言,即所谓的“无处不在的语言”。如果没有 PHP 中的集合,使用Arrays就很难实现这一点,因为您无法向它们添加行为。因此,通常会发生的情况是,您将该行为添加到您的实体中,但它不应该在那里。另一个问题是Arrays的可变性, VOs (值对象)必须始终是不可变的,这对于Arrays来说是不可能的,并且您应该始终保证该Array的elements都是相同的类型。
Collections和Arrays都表示一组元素。Collections ,而Arrays则支持。Arrays是 PHP 的数据结构,几乎用于所有用途。Arrays不允许添加新行为,而Collections允许。Arrays不允许为其元素定义类型,而Collections允许。 还有其他 PHP 集合,其中包括 Doctrine Collections 和 Illuminate Collections。这些集合解决了不同的问题,针对其特定用例进行了定制,并且它们的 API 非常广泛,更重要的是这些集合是可变的。这些组合使得很难将这些集合用于更简单的用例。这就是为什么我们在这里提供的 Collections 具有非常小的 API,甚至不公开 Iterator API。这样您就可以使用它们并根据您的需求扩展其行为。
isEmpty 、 count 、 toArray 、 contains 、 get 、 map 、 filter 、 slice 、 merge 、 reverse 、 reduce 、 first 、 last 、 head 、 tail 。 <?php declare (strict_types= 1 );
use DCSG ImmutableCollections ImmutableCollection ;
final class MyStringCollection extends ImmutableCollection {
protected function validateItems ( array $ elements ): void
{
foreach ( $ elements as $ element ) {
if (! is_string ( $ element )) {
throw new InvalidArgumentException ( ' Element is not a String. ' );
}
}
}
}
$ collection = MyStringCollection:: create ([ ' foo ' , ' bar ' ]);
echo $ collection -> count (); // 2
$ slicedCollection = $ collection -> slice ( 0 , 1 ); // MyStringCollection { $elements=['foo']} <?php declare (strict_types= 1 );
use DCSG ImmutableCollections SetImmutableCollection ;
final class MyStringSetCollection extends SetImmutableCollection {
protected function validateItems ( array $ elements ): void
{
foreach ( $ elements as $ element ) {
if (! is_string ( $ element )) {
throw new InvalidArgumentException ( ' Element is not a String. ' );
}
}
}
}
$ collection = MyStringSetCollection:: create ([ ' foo ' , ' bar ' ]);
echo $ collection -> count (); // 2
$ slicedCollection = $ collection -> tail (); // MyStringSetCollection { $elements=['bar']}
$ collection = MyStringSetCollection:: create ([ ' foo ' , ' bar ' , ' foo ' ]); // Throws InvalidArgumentException 我们提供两个简单的例子来更好地理解。其中一项与发票有关,另一项与货船的腿有关。
请参阅变更日志以了解有关最近更改内容的更多信息。
$ composer test 有关详细信息,请参阅贡献和行为准则。
如果您发现任何与安全相关的问题,请发送电子邮件至 [email protected],而不是使用问题跟踪器。
麻省理工学院许可证 (MIT)。请参阅许可证文件以获取更多信息。