Библиотека, предоставляющая набор минималистичных типизированных и конвейерных неизменяемых коллекций для PHP.
PHP > 7.2
composer require dcsg/php-immutable-collections
Отсутствие дженериков в PHP не позволяет использовать типизированные коллекции в PHP.
Эта библиотека предоставляет две абстрактные неизменяемые коллекции:
Поскольку в PHP нет универсальных шаблонов, таких как Java, невозможно иметь собственные типизированные коллекции. Коллекции, доступные в этой библиотеке, являются основой для создания собственных типизированных коллекций, вам просто нужно их расширить.
Суть DDD заключается в том, чтобы ваш код говорил на бизнес-языке, так называемом Ubiquitous Language. Без коллекций в PHP этого очень сложно достичь с помощью Arrays
, потому что вы не можете добавить к ним поведение. Итак, что обычно происходит: вы добавляете это поведение в свою сущность, но его там не должно быть. Другая проблема заключается в изменчивости Arrays
. VOs
(объекты значений) ДОЛЖНЫ быть всегда неизменяемыми , а для Arrays
это невозможно, и вы всегда должны гарантировать, что все elements
этого Array
относятся к одному и тому же типу.
Collections
и Arrays
представляют собой группу элементов.Collections
не поддерживаются PHP изначально, в отличие от Arrays
.Arrays
— это структура данных PHP, которая используется практически во всем.Arrays
не позволяют добавлять новое поведение, тогда как Collections
позволяют это.Arrays
не позволяют вам определять тип для своих элементов, тогда как Collections
позволяют это. Существуют и другие коллекции для PHP, среди которых есть несколько коллекций Doctrine и Illuminate Collections. Эти коллекции решают различные проблемы, адаптированы к их конкретному варианту использования, а их API обширны и, что более важно, эти коллекции являются изменчивыми. Эти комбинации затрудняют использование этих коллекций в более простых случаях. Вот почему коллекции, которые мы здесь представляем, имеют очень маленький API и даже не предоставляют API Iterator. Таким образом, у вас есть возможность использовать их и расширять их поведение в соответствии с вашими потребностями.
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
Для лучшего понимания мы приведем два простых примера. Один касался счетов-фактур, а другой — ног грузового судна.
Пожалуйста, посетите CHANGELOG для получения дополнительной информации о том, что изменилось за последнее время.
$ composer test
Подробную информацию см. в разделах «ВКЛАД» и «КОДЕКС ПОВЕДЕНИЯ».
Если вы обнаружите какие-либо проблемы, связанные с безопасностью, отправьте электронное письмо по адресу [email protected] вместо использования системы отслеживания проблем.
Лицензия MIT (MIT). Дополнительную информацию см. в файле лицензии.