chillerlan / php-traits
Some useful traits for PHP 7.2+
Installs: 1 181 969
Dependents: 2
Suggesters: 0
Security: 0
Stars: 16
Watchers: 3
Forks: 0
Open Issues: 1
pkg:composer/chillerlan/php-traits
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, implementsEnumerableInterfaceArrayHelpersByteArray- useful for byte/bit-flipping purposes, extendsSplFixedArrayByteArrayDispenser- createsByteArrayfrom several data types (hex, base64, binary, json etc.)DotArray- adds dot key notation functionalitySearchableArray- deep search arrays usingRecursiveIteratorIterator
InterfacesArrayAccessTrait- implementsArrayAccessIteratorTrait- implementsIterator
SPLCountableTrait- implementsCountableSeekableIteratorTrait- 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 installto install the required dependencies and generate/vendor/autoload.php. - if you use a custom autoloader, point the namespace
chillerlan\Traitsto the foldersrcof 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;