PHP反射

我们要判断一个类里面是否存在该方法
  • 不使用反射案例:
public function initalize(array $config=array, $reset = true){
    $reflection = new ReflectionClass($this);
    // 遍历config,如果存在方法,就调用该用法,没有则赋值
    foreach ($config as $key => $value){
        if(method_exists($this,$key)){
            $this->$key($value);
        }else{
            $this-$key = $value;
        }
    }
}

这种方法有个弊端:无法判断config数组得所有key是否合法,是否是类得成员属性,然而PHP中得反射可以实现判断。
PHP反射中我们常用得方法有(getConstructor)获取类得构造函数,(getParameters)获取类得依赖,(newInstanceArgs)获取反射的实例,(hasProperty)判断类是否存在属性,(hasMethod)判断类是否存在函数,更多得方法请参考官网 Reflection

  • 使用反射案例
public function initialize(array $config = array(), $reset = TRUE)
{
    $reflection = new ReflectionClass($this);
...
    foreach ($config as $key => &$value)
    {
        if ($key[0] !== '_' && $reflection->hasProperty($key))
        {
            if ($reflection->hasMethod('set_'.$key))
            {
                $this->{'set_'.$key}($value);
            }
            else
            {
                $this->$key = $value;
            }
        }
    }
使用反射获取类得构造函数和依赖案例
class B{

}


class A {

    public function __construct(B $args)
    {
    }

    public function dosomething()
    {
        echo 'Hello world';
    }
}

//建立class A 的反射
$reflection = new ReflectionClass('A');

$b = new B();
$c = new B();

//获取class A 的实例
$instance = $reflection ->newInstanceArgs( [$b]);

$instance->dosomething(); //输出 ‘Hellow World’

$constructor = $reflection->getConstructor();//获取class A 的构造函数

$dependencies = $constructor->getParameters();//获取class A 的依赖类

dump($constructor);

dump($dependencies);

dump得到得结果如下:

//constructor
ReflectionMethod {#351 ▼
        +name: "__construct" 
        +class: "A" 
        parameters: array:1 [▶] 
        extra: array:3 [▶] 
        modifiers: "public"
}

//$dependencies
array:1 [▼
        0 => ReflectionParameter {#352 ▼
         +name: "args"
          position: 0
          typeHint: "B"
      }
]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值