Una biblioteca que proporciona un conjunto de colecciones inmutables minimalistas, escritas y canalizadas para PHP.
PHP > 7.2
composer require dcsg/php-immutable-collections
La falta de Genéricos en PHP no permite tener colecciones escritas en PHP.
Esta biblioteca proporciona dos colecciones inmutables abstractas:
Dado que PHP no tiene genéricos como Java, no es posible tener colecciones de tipo nativo. Las colecciones disponibles en esta biblioteca son la base para que usted pueda crear sus propias colecciones mecanografiadas, sólo necesita ampliarlas.
DDD se trata de que su código hable el lenguaje empresarial, el llamado lenguaje ubicuo. Sin colecciones en PHP, esto es muy difícil de lograr usando Arrays
porque no se les puede agregar comportamiento. Entonces, lo que suele suceder es que agregas ese comportamiento a tu entidad, pero no debería estar allí. Otro problema es la mutabilidad de Arrays
, VOs
(Objetos de Valor) DEBEN ser siempre inmutables y eso es imposible con Arrays
y siempre debes garantizar que los elements
de ese Array
sean todos del mismo tipo.
Collections
como Arrays
representan un grupo de elementos.Collections
no son compatibles de forma nativa con PHP, mientras que Arrays
sí lo son.Arrays
son LA estructura de datos de PHP y se utilizan para casi todo.Arrays
no le permiten agregar nuevos comportamientos mientras que Collections
lo permiten.Arrays
no le permiten definir un tipo para sus elementos, mientras que Collections
sí lo permiten. Existen otras colecciones para PHP, entre las que se encuentran las colecciones Doctrine y Illuminate. Esas colecciones resuelven diferentes problemas, se adaptan a su caso de uso específico y sus API son extensas y, lo que es más importante, esas colecciones son mutables. Estas combinaciones dificultan el uso de esas colecciones para casos de uso más simples. Es por eso que las colecciones que proporcionamos aquí tienen una API muy pequeña y ni siquiera exponen la API Iterator. De esta manera tienes la posibilidad de utilizarlos y ampliar su comportamiento adaptado a tus necesidades.
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
Proporcionamos dos ejemplos simples para una mejor comprensión. Uno relacionado con facturas y otro sobre Tramos de un Buque de Carga.
Consulte CHANGELOG para obtener más información sobre los cambios recientes.
$ composer test
Consulte CONTRIBUCIÓN y CÓDIGO DE CONDUCTA para obtener más detalles.
Si descubre algún problema relacionado con la seguridad, envíe un correo electrónico a [email protected] en lugar de utilizar el rastreador de problemas.
La Licencia MIT (MIT). Consulte el archivo de licencia para obtener más información.