chillerlan / php-traits
Some useful traits for PHP 7.2+
Installs: 990 926
Dependents: 2
Suggesters: 0
Security: 0
Stars: 16
Watchers: 3
Forks: 0
Open Issues: 1
Requires
- php: ^7.2
- ext-json: *
Requires (Dev)
- phpunit/phpunit: ^8.0
README
A collection of (more or less) useful traits for PHP7.2+
Features
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
Documentation
Installation
requires composer
composer.json (note: replace dev-master
with a version boundary)
{ "require": { "php": "^7.2", "chillerlan/php-traits": "dev-master" } }
Manual installation
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!
Usage
ClassLoader
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
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
Enumerable
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;