我们要判断一个类里面是否存在该方法
- 不使用反射案例:
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"
}
]