A collection of (more or less) useful traits for PHP7.2+
ClassLoader
- invokes objects of a given class and interface/type with an arbitrary count of constructor argumentsMagic
- turns methods into magic propertiesEnumerable
- provides some of prototype's enumerable methods, implementsEnumerableInterface
ArrayHelpers
ByteArray
- useful for byte/bit-flipping purposes, extendsSplFixedArray
ByteArrayDispenser
- createsByteArray
from several data types (hex, base64, binary, json etc.)DotArray
- adds dot key notation functionalitySearchableArray
- deep search arrays usingRecursiveIteratorIterator
Interfaces
ArrayAccessTrait
- implementsArrayAccess
IteratorTrait
- implementsIterator
SPL
CountableTrait
- implementsCountable
SeekableIteratorTrait
- implementsSeekableIterator
requires composer
composer.json (note: replace dev-master
with a version boundary)
{
"require": {
"php": "^7.2",
"chillerlan/php-traits": "dev-master"
}
}
Download the desired version of the package from master or release and extract the contents to your project folder. After that:
- run
composer install
to install the required dependencies and generate/vendor/autoload.php
. - if you use a custom autoloader, point the namespace
chillerlan\Traits
to the foldersrc
of the package
Profit!
Simple usage:
class MyClass{
use ClassLoader;
protected function doStuff(string $class){
$obj = $this->loadClass(__NAMESPACE__.'\\Whatever\\'.$class);
// do stuff
}
}
Let's assume we have several classes that implement the same interface, but their constructors have different parameter counts, like so:
class SomeClass implements MyInterface{
public funtion __construct($param_foo){}
}
class OtherClass implements MyInterface{
public funtion __construct($param_foo, $param_bar){}
}
Initialize an object based on a selction
class MyClass{
use ClassLoader;
protected $classes = [
'foo' => SomeClass::class,
'bar' => OtherClass::class
];
protected funtion initInterface(string $whatever, $foo, $bar = null):MyInterface{
foreach($this->classes as $what => $class){
if($whatever === $what){
return $this->loadClass($class, MyInterface::class, $foo, $bar);
}
}
}
}
Magic
allows to access internal methods like as properties.
class MyMagicContainer{
use Magic;
protected $foo;
protected function magic_get_foo(){
// do whatever...
return 'foo: '.$this->foo;
}
protected function magic_set_foo($value){
// do stuff with $value
// ...
$this->foo = $value.'bar';
}
}
$magic = new MyMagicContainer;
$magic->foo = 'foo';
var_dump($magic->foo); // -> foo: foobar
class MyEnumerableContainer implements EnumerableInterface{
use Enumerable;
public function __construct(array $data){
$this->array = $data;
}
}
$enum = new MyEnumerableContainer($data);
$enum
->__each(function($value, $index){
// do stuff
$this->array[$index] = $stuff;
})
->__reverse()
->__to_array()
;
$arr = $enum->__map(function($value, $index){
// do stuff
return $stuff;
});
$enum;