Wallogit.com
2017 © Pedro Peláez
Immutable implementation of the Collection interface., (*2)
Provides an abstract ImmutableCollection class, which extends (and restricts) the SplFixedArray class, as well as several traits with behavioural logic for (derived) immutable collection classes., (*3)
Regular php "arrays" are not really arrays at all, but sorted hash maps. They are not objects, they are not thread safe and they cannot guard their own invariants., (*4)
Although sorted hash maps are a versatile data structure that can be used in many different scenarios, they aren't always good data structures for the situation., (*5)
When dealing with a collection of objects, for instance, you probably want dedicated collection objects, on which you can call methods., (*6)
Many frameworks provide some sort of collection class. They rarely provide immutability, though, and are therefore not thread safe. Additionally, they are usually implementing a bloated interface with all of the methods you might some day need - but probably won't., (*7)
Due to the many optional expansions which can be applied at will, this package enables powerful typesafe collections that can be fine-tunes for use in any project, without getting distracted by a bloated collection interface., (*8)
The immutability of the collection means they can be used in projects that care about reducing state changes., (*9)
Install using composer:, (*10)
composer require stratadox/immutable-collection
The most basic implementation of the immutable collection might look something like the following:, (*11)
<?php
class Numbers extends ImmutableCollection
{
public function __construct(int ...$items)
{
parent::__construct(...$items);
}
}
Or:, (*12)
<?php
class Things extends ImmutableCollection
{
public function __construct(Thing ...$things)
{
parent::__construct(...$things);
}
}
Additional behaviour can be added by implementing the relevant interfaces and/or traits for the particular concrete collection:, (*13)
<?php
class Numbers extends ImmutableCollection implements Appendable
{
use Appending;
public function __construct(int ...$items)
{
parent::__construct(...$items);
}
}
$numbers = new Numbers(1, 2, 3);
$numbers = $numbers->add(4);
assert($numbers == new Numbers(1, 2, 3, 4));
Multiple kinds of behaviour can be used simultaneously:, (*14)
<?php
class Numbers extends ImmutableCollection implements Mergeable, Purgeable
{
use Merging, Purging;
public function __construct(int ...$items)
{
parent::__construct(...$items);
}
}
$numbers = new Numbers(1, 2, 3);
$numbers = $numbers->merge(new Numbers(4, 5, 6));
$numbers = $numbers->remove(3);
assert($numbers == new Numbers(1, 2, 4, 5, 6));
The shorthand for which is:, (*15)
<?php
$numbers = (new Numbers(1, 2, 3))
->merge(new Numbers(4, 5, 6))
->remove(3);
assert($numbers == new Numbers(1, 2, 4, 5, 6));
If desired, the methods current and offsetGet may be implemented with a
return type hint, in order to (further) increase type safety and to allow
IDE's like PhpStorm to provide code completion in loops and array-like access:, (*16)
<?php
class Things extends ImmutableCollection
{
public function __construct(Thing ...$things)
{
parent::__construct(...$things);
}
public function current(): Thing
{
return parent::current();
}
public function offsetGet($index): Thing
{
return parent::offsetGet($index);
}
}