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- 对于字节/位翻转等用途很有用,扩展了SplFixedArrayByteArrayDispenser- 从几种数据类型(十六进制、base64、二进制、json 等)创建ByteArrayDotArray- 添加点键名功能SearchableArray- 使用RecursiveIteratorIterator深度搜索数组
接口ArrayAccessTrait- 实现ArrayAccessIteratorTrait- 实现Iterator
SPLCountableTrait- 实现CountableSeekableIteratorTrait- 实现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;