Библиотека, предоставляющая набор минималистичных типизированных и конвейерных неизменяемых коллекций для 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). Дополнительную информацию см. в файле лицензии.