PHP的反射

通过反射,我们可以在只有对象的时候获取这个对象所属的类,所拥有的属性和方法等等,甚至可以调用这个对象

通过反射,我们可以在只有对象的时候获取这个对象所属的类,所拥有的属性和方法等等,甚至可以调用这个对象中的方法。反射API使用起来不复杂,首先定义一个类,并实例化一个对象。

name . "," . "性别是" . $this->gender . "
"; } public function \_\_set($name, $value) { echo "设置属性:$name:$value
"; $this->$name = $value; } public function \_\_get($name) { if (!isset($this->$name)) { echo '未设置'; $this->name = "正在为你设置默认值"; } return $this->$name; } } $student = new person(); $student->name = "jzz"; $student->sex = 'man'; $student->age = 24; $student->say(); ?>

在上面的代码中定义了一个person类,有属性name和sex在下面实例化了一个student对象,并且给它设定nam=jzz,sex=man,这个地方要注意,类的定义中并没有age,但是我这里却给age赋值,这个地方是PHP的动态特性,在实例化对象时动态添加属性,非常的灵活。最后调用student的say方法输出。正常来说你只能通过调用公有的say方法来显示类中的私有属性,但是通过反射,可以绕过这种限制,破坏类的封装性。定义一个function专门用作反射

class person {
function my_reflection($object) {
$reflect = new ReflectionObject($object);
echo “此类中有如下属性:
“;
$props = $reflect->getProperties();
foreach ($props as $prop) {
echo $prop->isPublic() ? ‘public ‘ : ‘’;
echo $prop->isProtected() ? ‘protected ‘ : ‘’;
echo $prop->isPrivate() ? ‘private ‘ : ‘’;
echo $prop->getName() . “=”;
$prop->setAccessible(true);
print_r($prop->getValue($object));
echo “
“;
}
echo “此类中有如下方法:
“;
$methods = $reflect->getMethods();
foreach ($methods as $method) {
echo “function “ . $method->getName() . “
“;
}
}
}

这个方法就是对传入的对象进行反射然后输出对象中的信息,通过ReflectionObject类中的getProperties方法就可以获取属性,再通过foreach遍历循环输出类中的属性名字,通过isPublic,isPrivate,isProtected来显示属性的可访问性。然后通过getValue获取属性的值,这里要注意,如果属性是私有的那么将无法显示,所以这里把setAccessible设置为true,将属性设置为可访问,然后私有和保护的属性就可以访问并获取到值了。最后同样通过ReflectionObject类中的getMethods()来获取类中的方法名并输出。

传入student类运行结果:

可以看到直接就获取了对象中的信息。

反射在某些时候可以提升代码的简洁度,但要注意反射也有坏处,首先就是破坏了类的封装性,其次就是反射很占用资源,所有有替代方法就不要使用反射。