php immutable collections
versions
一个为 PHP 提供一组简约、类型化和管道式不可变集合的库。
PHP > 7.2
composer require dcsg/php-immutable-collections
PHP 中缺少泛型,因此不允许在 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)。请参阅许可证文件以获取更多信息。