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更是有几十个,可以说,反射完整地描述了一个类或者对象的原型。反射不仅可以用于类和对象,还可以用于函数,扩展模块,异常等。
<强>反射有什么作用强>
反射可以用于文档生成,因此可以用它对文件里的类进行扫描,逐个生成描述文档。