Une bibliothèque qui fournit un ensemble de collections immuables minimalistes, typées et canalisées pour PHP.
PHP > 7.2
composer require dcsg/php-immutable-collections
Le manque de Génériques en PHP ne permet pas d'avoir des collections typées en PHP.
Cette bibliothèque fournit deux collections abstraites immuables :
Puisque PHP n'a pas de génériques comme Java, il n'est pas possible d'avoir des collections typées natives. Les collections disponibles dans cette bibliothèque constituent la base sur laquelle vous pouvez créer vos propres collections typées, il vous suffit de les étendre.
DDD consiste à ce que votre code parle le langage des affaires, appelé langage omniprésent. Sans collections en PHP, cela est très difficile à réaliser en utilisant Arrays
car vous ne pouvez pas leur ajouter de comportement. Donc, ce qui se passe habituellement, vous ajoutez ce comportement à votre entité mais il ne devrait pas être là. Un autre problème est la mutabilité des Arrays
, VOs
(Value Objects) DOIVENT être toujours immuables et c'est impossible avec Arrays
et vous devez toujours garantir que les elements
de ce Array
sont tous du même type.
Collections
et Arrays
représentent tous deux un groupe d'éléments.Collections
ne sont pas nativement prises en charge par PHP, contrairement Arrays
.Arrays
sont LA structure de données de PHP et sont utilisés pour presque tout.Arrays
ne vous permettent pas d'ajouter de nouveaux comportements alors que Collections
le permettent.Arrays
ne vous permettent pas de définir un type pour ses éléments alors que Collections
le permettent. Il existe d'autres collections pour PHP, pour n'en citer que quelques-unes : Doctrine Collections et Illuminate Collections. Ces collections résolvent différents problèmes, sont adaptées à leur cas d'utilisation spécifique, et leurs API sont étendues et plus importantes encore, ces collections sont mutables. Ces combinaisons rendent difficile l'utilisation de ces collections pour des cas d'utilisation plus simples. C'est pourquoi les collections que nous proposons ici ont une très petite API et n'exposent même pas l'API Iterator. De cette façon, vous avez la possibilité de les utiliser et d'étendre son comportement adapté à vos besoins.
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
Nous fournissons deux exemples simples pour une meilleure compréhension. L’un concernait les factures et l’autre concernait les segments d’un cargo.
Veuillez consulter CHANGELOG pour plus d'informations sur ce qui a changé récemment.
$ composer test
Veuillez consulter CONTRIBUTION et CODE DE CONDUITE pour plus de détails.
Si vous découvrez des problèmes liés à la sécurité, veuillez envoyer un e-mail à [email protected] au lieu d'utiliser le suivi des problèmes.
La licence MIT (MIT). Veuillez consulter le fichier de licence pour plus d'informations.