初见PHP反射

来源:互联网 发布:商标制作软件 编辑:程序博客网 时间:2024/04/29 06:24
什么是反射?指在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{publicagepublicnamefunction __get(){}function __set(){}function del(){}function show(){}}

0 0
原创粉丝点击