PHP中反射机制的原理是什么

  

PHP中反射机制的原理是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

<强>反射

面向对象编程中对象被赋予了自省的能力,而这个自省的过程就是反射。

反射,直观理解就是根据到达地找到出发地和来源。比如,一个光秃秃的对象,我们可以仅仅通过这个对象就能知道它所属的类,拥有哪些方法。

反射是指在PHP运行状态中,扩展分析PHP程序,导出或提出关于类,方法,属性,参数等的详细信息,包括注释。这种动态获取信息以及动态调用对象方法的功能称为反射API。

<>强如何使用反射API

& lt; PHP ?   {class 人   public  $名称;   美元public 性别;   public  function 说(){   echo 才能;这→美元的名字,“,\ tis “这→美元性别,“\ r \ n";   }   public  function 集(名称、美元,美元值),{   echo 才能“Setting  name 美元,用美元value  \ r \ n";   这个美元才能→name=美元,美元的价值;   }   public  function  get(名字)美元,{   如果才能(!收取(这→美元名称)){   ,,,echo  & # 39;未设置& # 39;;   ,,,,   ,,,,这个→美元$ name=罢谖闵柚媚现怠?   ,,}   return 才能;这→美元美元名称;   ,,}   }   学生美元=new 人();   学生→美元name=& # 39;汤姆# 39;;   学生→美元性别=& # 39;男性# 39;;   学生→美元=24岁;

现在,要获取这个学生对象的方法和属性列表该怎么做呢?如以下代码所示:

//,获取对象属性列表   $ reflect =, new  ReflectionObject(学生);   道具=,反映美元→getproperty ();   foreach  (props 美元;as 支撑美元),{   print 才能;支撑美元→getName(),干净\ n";   }//,获取对象方法列表   m=反映→美元getMethods ();   foreach  (m 美元;as 支撑美元),{   print 才能;支撑美元→getName(),干净\ n";   }

也可以不用反射API,使用类函数,返回对象属性的关联数组以及更多的信息:

//,返回对象属性的关联数组   var_dump (get_object_vars(学生)美元);//,类属性   var_dump (get_class_vars (get_class(学生)美元));//,返回由类的方法名组成的数组   var_dump (get_class_methods (get_class(学生)美元));

假如这个对象是从其他页面传过来的,怎么知道它属于哪个类呢?一句代码就可以搞定:

//,获取对象属性列表所属的类   echo  get_class(学生)美元;

反射API的功能显然更强大,甚至能还原这个类的原型,包括方法的访问权限等,如:

//,反射获取类的原型   $ obj =, new  ReflectionClass(& # 39;简历及# 39;);   美元$ className =, obj→getName ();   $ Methods =, Properties 美元;=,数组();   foreach (obj→美元getproperty (), as  v)美元   {   美元$属性[v→getName ()],=, v美元;   }   foreach (obj→美元getMethods (), as  v)美元   ,   ,{   美元$方法[v→getName ()],=, v美元;   }   echo “class  {$ className} \ n {\ n";   is_array(属性),和ksort($属性);   foreach ($ Properties  as  k 美元;=祝辞,v)美元   {   echo “\ t";   echo  v→美元isPublic(), ?, & # 39;,公共# 39;,:,& # 39;& # 39;v→美元isPrivate(), ?, & # 39;,私人# 39;,:,& # 39;& # 39;   v→美元isProtected(), ?, & # 39;,保护# 39;,:,& # 39;& # 39;   v→美元isStatic(), ?, & # 39;,静态# 39;,:,& # 39;& # 39;;   echo “\ t {$ k} \ n";   }   echo “\ n";   如果(is_array(方法)美元),ksort($方法);   foreach ($ Methods  as  k 美元;=祝辞,v)美元   {   echo “\ tfunction  {$ k} () {} \ n";   }   echo “} \ n";

输出如下:

class 人   {   ,公众的性别   ,公共的名字   function 才能;get () {}   function 才能;设置(){}   function 才能说(){}   }

不仅如此,PHP手册中关于反射API更是有几十个,可以说,反射完整地描述了一个类或者对象的原型。反射不仅可以用于类和对象,还可以用于函数,扩展模块,异常等。

<强>反射有什么作用

反射可以用于文档生成,因此可以用它对文件里的类进行扫描,逐个生成描述文档。

PHP中反射机制的原理是什么