chillerlan / php-traits
此包已被 废弃 并不再维护。未建议替代包。
PHP 7.2+ 的一些有用特性
3.0.2
2019-03-21 02:32 UTC
Requires
- php: ^7.2
- ext-json: *
Requires (Dev)
- phpunit/phpunit: ^8.0
README
PHP7.2+ (或多或少)有用的特性集合
特性
ClassLoader
- 调用具有任意数量构造函数参数的给定类和接口/类型的对象Magic
- 将方法转换为魔法属性Enumerable
- 提供了一些 prototype 的可枚举方法,实现了EnumerableInterface
数组辅助函数
ByteArray
- 对于字节/位翻转等用途很有用,扩展了SplFixedArray
ByteArrayDispenser
- 从几种数据类型(十六进制、base64、二进制、json 等)创建ByteArray
DotArray
- 添加点键名功能SearchableArray
- 使用RecursiveIteratorIterator
深度搜索数组
接口
ArrayAccessTrait
- 实现ArrayAccess
IteratorTrait
- 实现Iterator
SPL
CountableTrait
- 实现Countable
SeekableIteratorTrait
- 实现SeekableIterator
文档
安装
需要 composer
composer.json (注意:用版本范围替换 dev-master
)
{ "require": { "php": "^7.2", "chillerlan/php-traits": "dev-master" } }
手动安装
从 master 或 发布版 下载所需版本的包,并将其内容解压缩到您的项目文件夹中。然后
- 运行
composer install
以安装所需依赖并生成/vendor/autoload.php
。 - 如果您使用自定义自动加载器,将命名空间
chillerlan\Traits
指向包的src
文件夹
成功!
使用
ClassLoader
简单使用
class MyClass{ use ClassLoader; protected function doStuff(string $class){ $obj = $this->loadClass(__NAMESPACE__.'\\Whatever\\'.$class); // do stuff } }
假设我们有一些实现了相同接口但构造函数参数数量不同的类,如下所示
class SomeClass implements MyInterface{ public funtion __construct($param_foo){} } class OtherClass implements MyInterface{ public funtion __construct($param_foo, $param_bar){} }
基于选择初始化对象
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
允许将内部方法访问为属性。
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;