什么是反射?指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于这个类的方法、属性、参数、注释等信息。通俗来说就是获取该类的信息,至于你要获取来干嘛,这个就看你自己的需求了。下面是一个小例子:
效果:
class Test{
public $name;
public $age;
public static function show(){
echo 'this is show action';
}
public function del(){
echo $this->name;
}
public function __set($name,$value){
$this->$name = $value;
}
public function __get($name){
if(isset($thsi->$name)){
return $this->$name;
}else{
echo 'error';
}
}
}
$obj = new Test();
$obj->name = 'lu';
$obj->age = 5;
//Reflection 反射类
//以对象作为反射的对象
$res = new ReflectionObject($obj);
//以类作为反射的对象 两个效果相同
//$res = new ReflectionClass('Test');
//获取$obj对象的一组属性,返回一个数组 里面包含 属性名 和 所属类
$p = $res->getProperties();
//var_dump($p);
$m = $res->getMethods();
//var_dump($m);
array(2) { [0]=> &object(ReflectionProperty)#2 (2) { ["name"]=> string(4) "name" ["class"]=> string(4) "Test" } [1]=> &object(ReflectionProperty)#3 (2) { ["name"]=> string(3) "age" ["class"]=> string(4) "Test" } }
array(4) { [0]=> &object(ReflectionMethod)#5 (2) { ["name"]=> string(4) "show" ["class"]=> string(4) "Test" } [1]=> &object(ReflectionMethod)#6 (2) { ["name"]=> string(3) "del" ["class"]=> string(4) "Test" } [2]=> &object(ReflectionMethod)#7 (2) { ["name"]=> string(5) "__set" ["class"]=> string(4) "Test" } [3]=> &object(ReflectionMethod)#8 (2) { ["name"]=> string(5) "__get" ["class"]=> string(4) "Test" }}
甚至还可以获取该类的原型:
$obj = new ReflectionClass('Test');
//获取类名
$class_name = $obj->getName();
$m = array();
$p = array();
//获取该类的属性 返回一个数组对象 我们把它遍历出来
foreach($obj->getProperties() as $v){
//$V 是一个 ReflectionProperty该类报告了类的属性的相关信息。
$p[$v->getName()] = $v;
}
/*
array(2) {
["name"]=>
object(ReflectionProperty)#2 (2) {
["name"]=>
string(4) "name"
["class"]=>
string(4) "Test"
}
["age"]=>
object(ReflectionProperty)#3 (2) {
["name"]=>
string(3) "age"
["class"]=>
string(4) "Test"
}
}
*/
//获取方法
foreach($obj->getmethods() as $v){
//$V 是一个 ReflectionMethod类报告了一个方法的有关信息。
$m[$v->getName()] = $v;
}
/*
array(4) {
["show"]=>
object(ReflectionMethod)#4 (2) {
["name"]=>
string(4) "show"
["class"]=>
string(4) "Test"
}
["del"]=>
object(ReflectionMethod)#5 (2) {
["name"]=>
string(3) "del"
["class"]=>
string(4) "Test"
}
["__set"]=>
object(ReflectionMethod)#6 (2) {
["name"]=>
string(5) "__set"
["class"]=>
string(4) "Test"
}
["__get"]=>
object(ReflectionMethod)#7 (2) {
["name"]=>
string(5) "__get"
["class"]=>
string(4) "Test"
}
}
*/
//拼凑字符串 组成类的形式
echo "class {$class_name}\n{\n";
//ksort 对数组按照键名逆向排序
is_array($p)&&ksort($p);
foreach($p as $k => $v){
//此时 $v 还是一个 ReflectionProperty 的一个对象
echo "\t";
echo $v->isPublic() ? 'public' : '';
echo $v->isPrivate() ? 'private' : '';
echo $v->isProtected() ? 'protected' : '';
echo "\t{$k}\n";
}
echo "\n";
is_array($m)&&ksort($m);
foreach($m as $k => $v){
//此时 $v 还是一个 ReflectionProperty 的一个对象
echo "\tfunction {$k}(){}\n";
}
echo "}\n";
效果:
class Test
{
public age
public name
function __get(){}
function __set(){}
function del(){}
function show(){}
}