Collection classes for strict(ish) typing
stephenfrank/typedcollections: "0.1.x"
, (*1)
A collection of helper classes to enforce type safety in array collections., (*2)
The base class is array-accessible and enforces type-strictness by checking each item added to the collection against the defined type., (*3)
The type can be defined through the constructor arguments or will be defined automatically based on the first item added., (*4)
$integerCollection = new TypedCollection([1, 2]); $integerCollection[] = 'a'; // throws InvalidArgumentException
Several classes have built-in types for strict checking against:, (*5)
BoolCollection
IntegerCollection
FloatCollection
StringCollection
ArrayCollection
ObjectCollection
$stringCollection = new StringCollection; $stringCollection[] = 'foo'; $stringCollection[] = true; // throws InvalidArgumentException
The ClassCollection will check that each item added to the array is of a particular class using get_class()
., (*6)
$foosCollection = new ClassCollection([new Foo]); // or new ClassCollection([new Foo], 'Foo'); $stringCollection[] = new StdClass; // throws InvalidArgumentException
The InstanceCollection will check each item using instanceof
so that collections can be defined by an interface or inherited class., (*7)
$foosCollection = new InstanceCollection([ new ArrayObject, new ArrayIterator ], 'ArrayAccess'); // This is A-okay
Sometimes type strictness is important when exposing a public API in a framework or library. Effectively it reduces the number of places where the API consumer can shoot themselves in the foot., (*8)
class NumberAdder { public function sum(NumericCollection $numerics); }
Sometimes when using a third-party/legacy library you might want type-check against the kind of garbage they return and raise an exception when they don't return clean data, (*9)
$resources = new ClassCollection($thirdPartyThinger->getResources(), 'AcmeResource'); // Will explode if <Resource>[] is not returned
Lastly, InstanceCollection
makes it super easy to create your own typed collections., (*10)
class AcmeResourceCollection extends InstanceCollection { protected $type = 'AcmeResource'; }