saberyjs / refl-helper
这个库可以帮助创建指定类的对象,或者调用指定类的指定方法
2.0
2018-03-11 04:41 UTC
Requires
- php: >5.6
- saberyjs/exception: ^1.0
This package is auto-updated.
Last update: 2024-09-05 13:40:11 UTC
README
实际上这个库是一个轻量级的PHP依赖注入器
为什么要使用这个库。
如果你是一名PHP开发者,你会知道PHP有一个叫做反射的功能,有了这个功能,你可以做些很酷的事情,如下:你可以动态地创建对象,即使有一些依赖,这个库也会为你创建它,不仅如此,你还可以调用对象的任何公共方法,它的依赖也将被解析。
如何使用
首先,我们假设有两个类,代码如下
class Apple{ public function shape(){ return 'red'; } } class Person{ public function eat(Apple $apple){ echo $apple->shape(); } } class Hunter{ protected $weapon; public function __construct(Weapon $weapon) { $this->weapon=$weapon; } public function showWeapon(){ $this->weapon->display(); } private static function getInstance(Weapon $weapon){ return new self($weapon); } public static function create(Weapon $weapon){ return new self($weapon); } } class Weapon{ private $name; private $price; private $type; private $level; public function __construct($name,$price,$type,$level) { $this->name=$name; $this->price=$price; $this->type=$price; $this->level=$level; } public function display(){ echo 'weapon detail of'.$this->name.':'.$this->price.'-'.$this->type.':'.$this->level; } }
正如你所见,有两个名为Apple和Person的类,如果你想调用Person的eat方法,你可以这样做。以下代码展示了如何使用这个库。
$defaultConfig=[ 'name'=>"saberyjs", 'price'=>100, 'type'=>'Melee', 'level'=>4 ]; $config=[ 'method'=>[ 'getInstance', 'create' ], 'factory'=>[ Hunter::class=>function(){ return new Hunter($routeHelper->get(Weapon::class)); } ] ]; $reflHelper=new ReflHelper($config,$defaultConfig); $reflHelper->callMethod($reflHelper->get(Apple::class),'eat'); $reflHelper->get(Hunter::class)->display();
正如你所见,这个库非常容易使用。总之,你可以按照以下步骤进行:
- 调用 $reflHelper->get() 可以获取一个对象
- 调用 $reflHelper->callMethod() 可以调用一个对象的方法
- 调用 $reflHelper->callStaticMethod() 可以调用静态方法
如果你仔细查看上面的代码,你会发现我们在创建ReflHelper时传递了两个参数($config,$defaultConfig),其中config包含两个主要键(method,factory),method键指定了库创建实例时将调用的方法,如果类的`__constructor`不存在,则defaultConfig包含默认值,如果它是其他类的依赖项,则使用该默认值
ReflHelper将为你做所有事情,甚至,你不需要创建Apple对象,不仅如此,这个库还支持一个函数:上面的代码将创建指定类的实例,解析依赖
联系方式
电子邮件:saberyjs@gmail.com QQ:1174332406