chillerlan/php-traits

此包已被 废弃 并不再维护。未建议替代包。

PHP 7.2+ 的一些有用特性

3.0.2 2019-03-21 02:32 UTC

This package is auto-updated.

Last update: 2021-05-21 12:58:14 UTC


README

PHP7.2+ (或多或少)有用的特性集合

version license Travis Coverage Scrunitizer Packagist downloads PayPal donate

特性

  • ClassLoader - 调用具有任意数量构造函数参数的给定类和接口/类型的对象
  • Magic - 将方法转换为魔法属性
  • Enumerable - 提供了一些 prototype 的可枚举方法,实现了 EnumerableInterface
  • 数组辅助函数
    • ByteArray - 对于字节/位翻转等用途很有用,扩展了 SplFixedArray
    • ByteArrayDispenser - 从几种数据类型(十六进制、base64、二进制、json 等)创建 ByteArray
    • DotArray - 添加点键名功能
    • SearchableArray - 使用 RecursiveIteratorIterator 深度搜索数组
  • 接口
  • SPL

文档

安装

需要 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;