saberyjs/refl-helper

这个库可以帮助创建指定类的对象,或者调用指定类的指定方法

2.0 2018-03-11 04:41 UTC

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;
    }
}

正如你所见,有两个名为ApplePerson的类,如果你想调用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