php反射通过使用 ReflectionClass
类实现。
现在有Hello
类:
Hello.php
class Hello {
public $value = 0;
public $name;
public function __construct() {
}
/**
* @return mixed
*/
public function getName()
{
return 'name';
}
/**
* @param mixed $name
*/
public function setName($name)
{
$this->name = $name;
}
/**
* @return int
*/
public function getValue()
{
return $this->value;
}
/**
* @param int $value
*/
public function setValue($value)
{
$this->value = $value;
}
}
在main.php
中使用反射
require_once ('Hello.php');
/*
* 建立 Hello 类的反射类
*/
$class = new ReflectionClass('Hello');
/*
* 通过反射类获取 Hello 类实例
*/
$instance = $class->newInstance();
创建ReflectionClass
实例,参数为对应的类名,调用ReflectionClass
对象的newInstance
方法获得Hello
类实例。动态的加载了Hello
类。
/*
* 通过反射类获取 Hello 类的属性
*/
$properties = $class->getProperties();
foreach($properties as $property) {
echo $property->getName()."<br/>";
}
调用ReflectionClass
对象的getProperties
获得所有属性,也可以使用getProperty(name)
获得具体的某个属性。
/*
* 获取 Hello 类的所有方法
*/
$methods = $class->getMethods();
foreach($methods as $method) {
echo $method->getName().'<br/>';
}
和获得属性类似,调用getMethod(name)
可以获得具体某个的方法。
/*
* 获取 Hello 某个方法
*/
$method = $class->getMethod('getName');
echo $method.'<br/>';
/*
* 执行获取到的方法
*/
echo $method->invoke($instance);
通过反射获取某个方法,然后使用invoke
调用该方法,参数为获取到的类的实例。